当矩阵乘法是跟踪的参数时,Matlab的内部工作是否进行全矩阵乘法?

时间:2015-08-30 08:25:49

标签: matlab

当矩阵乘法作为trace函数的参数给出时,Matlab会进行全矩阵乘法吗?

例如,在下面的代码中,A * B实际上是否发生,或者B的列是否用A的行加点,然后求和?还是会发生其他事情?

A = [2,2;2,2];
B = eye(2);
f = trace(A*B);

1 个答案:

答案 0 :(得分:5)

是的,MATLAB会计算产品,但你可以避免它!

首先,让我们看看如果你做f = trace(A*B),MATLAB会做什么:

我认为我的性能监视器中的图片说明了这一切。第一个凹凸是我创建一个大A = 2*ones(n)时,第二个非常小的凹凸用于创建B = eye(n),最后一个凹凸是计算f = trace(A*B)的位置。

enter image description here

现在,如果您手动执行此操作,请注意:

如果您手动执行此操作,则可以节省大量内存,并且可以更快更多

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

enter image description here

现在,正如您在评论中提到的那样:&#34;如果您在优化可以启动的功能中使用它,这仍然是正确的吗?&#34;

这取决于你在这里的意思,但作为一个简单的例子:

计算x = inv(A)*b可以通过几种不同的方式完成。如果你这样做:

x = A\b; 

MATLAB将选择最适合您特定矩阵/向量的算法。这里有许多不同的选择,取决于矩阵的结构:它是三角形,hermatian,稀疏......?通常它是一个上/下三角测量。我几乎可以向您保证,您无法在MATLAB 中编写代码,这些代码可以胜过MATLAB内置函数。

但是,如果你用这种方式计算相同的东西:

x = inv(A)*b;

MATLAB实际上会计算A的倒数,然后将其乘以b,即使之后没有将逆数存储在工作空间中。这要慢得多,也可能不准确。 (在A\b方法中,如果需要,MATLAB将创建一个置换矩阵以确保数值稳定性。