多维外部产品(`kron`)的矢量化版本

时间:2019-02-21 17:51:33

标签: matlab matrix vectorization

我已经概括了3向量和它本身之间的外部乘积,以从3向量的集合(NxNx3矩阵)中获取输入。

此刻,我的函数完成了我想要的事情(请参见下面的示例输出和输入),看起来像这样。我想通过避免当前使用的两个for循环来使其更快。

function [rr]=OuterVec(r)

N = size(r,1);
rr = zeros(N,N,3,3);

for i=1:N
    for j=1:N
        rr(i,j,:,:)=kron(reshape(r(i,j,:),[1,3]),permute(r(i,j,:),[3 2 1]));
    end
end
end

I / O示例

c = ones(2,2);
V(1,1,:)=[1 2 3];
u = c.*V;
  
    

OuterVec(u)

  
     

ans(:,:,1,1)=

 1     1
 1     1
     

ans(:,:,2,1)=

 2     2
 2     2
     

ans(:,:,3,1)=

 3     3
 3     3
     

ans(:,:,1,2)=

 2     2
 2     2
     

ans(:,:,2,2)=

 4     4
 4     4
     

ans(:,:,3,2)=

 6     6
 6     6
     

ans(:,:,1,3)=

 3     3
 3     3
     

ans(:,:,2,3)=

 6     6
 6     6
     

ans(:,:,3,3)=

 9     9
 9     9

1 个答案:

答案 0 :(得分:1)

您只需要置换尺寸并应用具有单例扩展的逐元素乘积:

rr = bsxfun(@times, r, permute(r, [1 2 4 3]));

或者,从Matlab R2016b开始,

rr = r .* permute(r, [1 2 4 3]);