【发布时间】:2019-09-04 10:10:23
【问题描述】:
我正在尝试加快评估外部产品矩阵的过程。我有一个名为 a 的 4*n 矩阵。我想通过公式评估a 每一行的外积矩阵:
K = a*a';
如果我使用for 循环对该过程进行编码,则如下:
K=zeros(4,4,size(a,2));
for i=1:size(a,2)
K(:,:,i) = a(:,i)*a(:,i)';
end
我找到了另一种方法,使用cellfun,比以前更慢。
acell = num2cell(a, 1);
b = cellfun(@(x)(x*x'),acell,'UniformOutput',false);
K = reshape(cell2mat(b),4,4,[]);
有没有什么好的方法来实现这些过程,比如矢量化?
【问题讨论】:
-
自 R2016b 以来,循环并不是天生就很慢 - source。
_fun系列函数(arrayfun,cellfun,...)基本上是变相的循环,在这种情况下,您必须执行额外的操作才能使用cellfun,所以我对此并不感到惊讶慢点。您的问题是优化已经在 MATLAB 中高度优化的东西(矩阵乘法)。循环可能是最快的选择,除非您只需要特定元素并且可以单独进行单独的乘法 -
@Wolfie 我尝试了这里提到的方法和我复制的答案。我这里只记录一下速度。我的 Matlab 版本是 2019a。我的“a”矩阵是 4*377644。我自己的“for循环”时间是0.4s; " obchardon的方法是0.036s;而使用"bsxfun"的How to Answer(stackoverflow.com/questions/25877835/…)是最快的,0.026s。至于最慢的"cellfun",需要7.3s。它们确实相差很大。
标签: matlab matrix linear-algebra