【问题标题】:How to compute a fast outer product between two matrices, in Matlab?如何在 Matlab 中计算两个矩阵之间的快速外积?
【发布时间】:2012-02-07 00:42:14
【问题描述】:

我有两个 n×m 矩阵,AB。我想创建一个新矩阵C,类似于:

for i = 1:n
    C = C + outerProduct(A(i,:), B(i,:));
end

C 是一个大小为 m x m 的矩阵,是 AB 行的所有外积的总和。

有没有一种不使用 for 循环的快速方法(鉴于 for 循环在 Matlab 中是出了名的慢)?

【问题讨论】:

    标签: matlab matrix vectorization


    【解决方案1】:

    您正在执行的操作(行外积的总和)相当于将转置版本的AB 相乘:

    C = A.'*B;
    

    您可以使用以下示例看到这一点:

    >> mat = magic(5);  %# A sample 5-by-5 matrix
    >> A = mat(1:4,:);  %# Create a 4-by-5 matrix
    >> B = mat(2:5,:);  %# Create another 4-by-5 matrix
    
    >> C = zeros(5);  %# Initialize C to be 5-by-5
    >> for i = 1:4, C = C + A(i,:).'*B(i,:); end;  %'# Calculate C as you are now
    
    >> isequal(C, A.'*B)  %'# Test for equality with the shorter solution
    
    ans =
    
         1  %# Equal!
    

    【讨论】:

    • 不,不会是这样——它使用每个单元格的内积。
    • $C_{ij} = \sum_k A_{ki} B_{kj} = \sum_k A^T_{ik} B_{kj} = A^T * B$
    【解决方案2】:

    您是否分析过您的 for 循环代码并发现它太慢了?如果没有,请在您花太多时间为循环惩罚而苦恼之前这样做。

    您的for 循环并不是特别糟糕,因为您只循环了n 次,但每个循环都执行O(n*m)。由于您每次迭代都做了很多工作,因此循环惩罚不会那么严重。真正糟糕的情况是嵌套循环,例如如果您也使用嵌套的 for 循环计算了外部产品。

    【讨论】:

    • 在使用 Matlab 时非常不鼓励使用 For 循环。这是一个“标准”的经验法则,不仅在 Matlab 中,而且在用于数值计算和相关领域的所有编程语言中。如果您可以“矢量化”您的操作,则可以执行一些优化并且您的代码可以运行,例如在 GPU 上更高效。
    【解决方案3】:

    也许我理解错了,但我相信你要找的是

    C = A*B';
    

    【讨论】:

    • 这将产生 n×n 结果,而不是 m×m 结果。
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2015-10-12
    • 2017-03-06
    • 2020-05-19
    • 2017-03-29
    相关资源
    最近更新 更多