如何在Matlab中计算两个矩阵之间的快速外积?

时间:2012-01-10 15:47:10

标签: matlab matrix vectorization

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

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

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

在没有for循环的情况下有没有一种快速的方法(假设for循环在Matlab中非常慢)?

3 个答案:

答案 0 :(得分:3)

您正在执行的操作(行外部产品的总和)相当于A的转置版本与B的乘积:

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!

答案 1 :(得分:2)

您是否已对自己的for循环代码进行了分析,发现它太慢了?如果没有,那么在你花费太多时间来讨厌循环惩罚之前,请先做好准备。

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

答案 2 :(得分:2)

也许我是误会,但我相信你在寻找的是

C = A*B';