Trong một đa chiều (tensor) Trường hợp y = u⊗v
, tôi tin rằng bạn cần phải thay đổi kích thước của các toán hạng thứ hai như vậy:
v_t = permute(v, circshift(1:(ndims(u) + ndims(v)), [0, ndims(u)]));
và sau đó nhân chúng với bsxfun
:
y = bsxfun(@times, u, v_t);
Phép nhân ma trận thông thường chỉ được xác định cho ma trận vector và 2-D, vì vậy chúng tôi không thể sử dụng nó trong trường hợp chung. Cũng cần lưu ý rằng tính toán này vẫn không thành công nếu toán hạng thứ hai là một véc tơ 1-D, bởi vì ndims
trả về 2 thay vì 1 cho vec-tơ. Với mục đích này, cho phép xác định chức năng của chúng ta mà đếm kích thước:
my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x));
Để hoàn thành câu trả lời, bạn có thể định nghĩa một hàm mới (. ví dụ một chức năng ẩn danh), như vậy:
outprod = @(u, v)bsxfun(@times, u, permute(v, circshift(1:(my_ndims(u) + my_ndims(v)), [0, my_ndims(u)])));
và sau đó sử dụng nó bao nhiêu lần tùy thích. Ví dụ, y = a×a×a
sẽ được tính như sau:
y = outprod(outprod(a, a), a);
Tất nhiên, bạn có thể viết một hàm tốt hơn mà phải mất một số biến của tham số để giúp bạn tiết kiệm một số cách gõ. Nội dung nào đó dọc theo các dòng sau:
function y = outprod(u, varargin)
my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x));
y = u;
for k = 1:numel(varargin)
v = varargin{k};
v_t = permute(v, circshift(1:(my_ndims(y) + my_ndims(v)),[0, my_ndims(y)]));
y = bsxfun(@times, y, v_t);
end
Tôi hy vọng tôi có quyền tính toán!
Tôi không hiểu những gì bạn muốn tính toán. Có phải 'y = a x a x a'? Nếu vậy, sản phẩm bên ngoài được định nghĩa như thế nào khi một trong các toán hạng là ma trận? –
Có, tôi muốn tính toán y = a x a x a. Hoặc những thứ tự cao hơn như, y = a x a x a x a x a. –