当矩阵乘法作为跟踪的参数给出时,Matlab是否进行全矩阵乘法函数吗?
例如,在下面的代码中,A*B实际上是否发生,或者B的列是否用A的行加点,然后求和?还是会发生其他事情?
A = [2,2;2,2];
B = eye(2);
f = trace(A*B);
Run Code Online (Sandbox Code Playgroud)
是的,MATLAB计算产品,但你可以避免它!
首先,让我们看看MATLAB如果做了什么f = trace(A*B):
我认为我的性能监视器中的图片说明了这一切.第一个凹凸是我创建一个大的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
Run Code Online (Sandbox Code Playgroud)
现在,正如你在评论中提到的那样:"如果你在优化可以启动的函数中使用它,这仍然是正确的吗?"
这取决于你在这里的意思,但作为一个简单的例子:
计算x = inv(A)*b可以通过几种不同的方式完成.如果你这样做:
x = A\b;
Run Code Online (Sandbox Code Playgroud)
MATLAB将选择最适合您的特定矩阵/向量的算法.这里有许多不同的选择,取决于矩阵的结构:它是三角形,hermatian,稀疏......?通常它是一个上/下三角测量.我几乎可以向你保证,你不能在MATLAB中编写一个能够胜过MATLAB内置函数的代码.
但是,如果你用这种方式计算同样的东西:
x = inv(A)*b;
Run Code Online (Sandbox Code Playgroud)
MATLAB实际上会计算倒数A,然后将其乘以b,即使逆之后没有存储在工作空间中.这要慢得多,也可能不准确.(在该A\b方法中,MATLAB将在必要时创建置换矩阵以确保数值稳定性.