【问题标题】:How to vectorize the evaluation of outer product matrix for every row of the 2D matrix? [duplicate]如何向量化二维矩阵每一行的外积矩阵的评估? [复制]
【发布时间】: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 系列函数(arrayfuncellfun,...)基本上是变相的循环,在这种情况下,您必须执行额外的操作才能使用 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


【解决方案1】:

您可以使用kron 将矩阵重复n 次,因此无需预分配,然后与a(:).' 执行逐元素乘法,最后重塑以添加第三维。

%Dummy 2D matrix 4x3
a = [1 4 7
     2 5 8
     3 6 9
     4 7 10]
%Size of the first dimension  
n = size(a,1);
%Repeat the matrix n time
p = kron(a,ones(1,n)).*a(:).'
%Reshape to A = 4x4x3
A = reshape(p,n,n,[])

你失去了 for 循环方法的可读性,但你应该提高性能。

【讨论】:

    猜你喜欢
    • 2017-07-24
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多