当矩阵乘法作为trace函数的参数给出时,Matlab会进行全矩阵乘法吗?
例如,在下面的代码中,A * B实际上是否发生,或者B的列是否用A的行加点,然后求和?还是会发生其他事情?
A = [2,2;2,2];
B = eye(2);
f = trace(A*B);
答案 0 :(得分:5)
是的,MATLAB会计算产品,但你可以避免它!
首先,让我们看看如果你做f = trace(A*B)
,MATLAB会做什么:
我认为我的性能监视器中的图片说明了这一切。第一个凹凸是我创建一个大A = 2*ones(n)
时,第二个非常小的凹凸用于创建B = eye(n)
,最后一个凹凸是计算f = trace(A*B)
的位置。
现在,如果您手动执行此操作,请注意:
如果您手动执行此操作,则可以节省大量内存,并且可以更快更多。
tic
n = 6e3;
A = rand(n);
B = rand(n);
f = trace(A*B);
toc
pause(10)
tic
C(n) = 0;
for ii = 1:n
C(ii) = sum(A(ii,:)*B(:,ii));
end
g = sum(C);
toc
abs(f-g) < 1e-10
Elapsed time is 11.982804 seconds.
Elapsed time is 0.540285 seconds.
ans =
1
现在,正如您在评论中提到的那样:&#34;如果您在优化可以启动的功能中使用它,这仍然是正确的吗?&#34;
这取决于你在这里的意思,但作为一个简单的例子:
计算x = inv(A)*b
可以通过几种不同的方式完成。如果你这样做:
x = A\b;
MATLAB将选择最适合您特定矩阵/向量的算法。这里有许多不同的选择,取决于矩阵的结构:它是三角形,hermatian,稀疏......?通常它是一个上/下三角测量。我几乎可以向您保证,您无法在MATLAB 中编写代码,这些代码可以胜过MATLAB内置函数。
但是,如果你用这种方式计算相同的东西:
x = inv(A)*b;
MATLAB实际上会计算A
的倒数,然后将其乘以b
,即使之后没有将逆数存储在工作空间中。这要慢得多,也可能不准确。 (在A\b
方法中,如果需要,MATLAB将创建一个置换矩阵以确保数值稳定性。