如何在matlab中一次性获取两个以上矩阵的外积?

Cem*_* S. 9 matlab product matrix multidimensional-array

我想计算y = a?a?a,在哪里a是n-by-1向量,并且?外部产品运算符.在这种情况下,y应该是n-by-n-by-n张量.

如果y = a?a,这很容易.我只是这样做:

y = a * a' 
Run Code Online (Sandbox Code Playgroud)

但在第一种情况下该怎么办?如果有两个以上的向量,如何在MATLAB中有效地计算这个外积?

Eit*_*n T 6

在多维(张量)的情况下y = u?v,我认为你需要移动第二个操作数的维度,如下所示:

v_t = permute(v, circshift(1:(ndims(u) + ndims(v)), [0, ndims(u)]));
Run Code Online (Sandbox Code Playgroud)

然后将它们乘以bsxfun:

y = bsxfun(@times, u, v_t);
Run Code Online (Sandbox Code Playgroud)

常规矩阵乘法仅针对向量和二维矩阵定义,因此我们不能在一般情况下使用它.

另请注意,如果第二个操作数是1-D向量,则此计算仍然会失败,因为ndims对于向量,返回2而不是1.为此,我们定义我们自己的维度函数:

my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x));
Run Code Online (Sandbox Code Playgroud)

要完成答案,您可以定义一个新函数(例如匿名函数),如下所示:

outprod = @(u, v)bsxfun(@times, u, permute(v, circshift(1:(my_ndims(u) + my_ndims(v)), [0, my_ndims(u)])));
Run Code Online (Sandbox Code Playgroud)

然后根据需要多次使用它.例如,y = a×a×a将像这样计算:

y = outprod(outprod(a, a), a);
Run Code Online (Sandbox Code Playgroud)

当然,您可以编写一个更好的函数,它可以使用可变数量的参数来为您节省一些输入.这些方面的东西:

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
Run Code Online (Sandbox Code Playgroud)

我希望我的数学合适!