外部产品计算的矢量化

时间:2017-05-31 22:32:27

标签: matlab vectorization matrix-multiplication

我有一个大小为A的矩阵KxN。我想在此矩阵的每一列与其自身之间获取外部产品,创建一个大小为KxKxN的新矩阵。我可以通过以下方式迭代地执行此操作:

N = 5;
K = 3;

A = rand(K,N);

nA = zeros(K,K,N); 
for n=1:N
    nA(:,:,n) = nA(:,:,n) + A(:,n)*A(:,n)';
end
通过编写mex文件(当N很大时)

或更快。但是,我还没弄清楚我能否以矢量化的方式做到这一点。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

如果您将数组重新调整为[K,1,N][1,K,N]的大小(即在适当的位置注入单个维度),则只需使用数组广播将它们相乘。

具有隐式广播的新版MATLAB:

nA_bcast = reshape(A,[1,K,N]).*reshape(A,[K,1,N])

bsxfun的帮助下,旧版本的MATLAB:

nA_bsxfun = bsxfun(@times, reshape(A,[1,K,N]),reshape(A,[K,1,N]))

三个相关数组(即nAnA_bcastnA_bsxfun)都是相同的。附注:A'将是伴随,你可能意味着A.'用于转置。