我有两个n-by-m矩阵A
和B
。我想创建一个新的矩阵C
,类似于:
for i = 1:n
C = C + outerProduct(A(i,:), B(i,:));
end
即。 C
是一个大小为m x m的矩阵,是A
和B
行的所有外积的总和。
在没有for循环的情况下有没有一种快速的方法(假设for循环在Matlab中非常慢)?
答案 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';