我想计算 y = a⊗a⊗a
,其中 a
是一个 n×1 向量,⊗
是outer product operator .在这种情况下,y
应该是一个 n×n×n 张量。
如果 y = a⊗a
,很容易。我只是这样做:
y = a * a'
但是第一种情况怎么办呢?如果有两个以上的向量,我如何在 MATLAB 中有效地计算这个外积?
在 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
希望我算对了!
我是一名优秀的程序员,十分优秀!