在多维(张量)情况下的
y = u⊗v
,我认为您需要移动第二个操作数的维度,如下所示:
v_t = permute(v, circshift(1:(ndims(u) + ndims(v)), [0, ndims(u)]));
然后使用bsxfun
函数对它们进行乘法运算:
y = bsxfun(@times, u, v_t);
常规矩阵乘法仅适用于向量和二维矩阵,因此我们无法在一般情况下使用它。
还要注意,如果第二个操作数是一维向量,则此计算仍将失败,因为 ndims
返回2而不是1。 为此,让我们定义一个自己的函数来计算维度:
my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x));
为了完整回答问题,您可以定义一个新的函数(例如匿名函数),如下所示:
outprod = @(u, v)bsxfun(@times, u, permute(v, circshift(1:(my_ndims(u) + my_ndims(v)), [0, my_ndims(u)])));
然后你可以随心所欲地使用它。例如,y = a×a×a
可以这样计算:
y = outprod(outprod(a, a), a)
当然,您可以编写一个更好的函数,以接受可变数量的参数,以便节省输入。可以按照以下方式编写该函数:
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
我希望我的计算没错!
y = a x a x a
吗?如果是,当其中一个操作数是矩阵时,外积如何定义? - Eitan T