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

DaB*_*Buj 2 matlab

当矩阵乘法作为跟踪的参数给出时,Matlab是否进行全矩阵乘法函数吗?

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

A = [2,2;2,2];
B = eye(2);
f = trace(A*B);
Run Code Online (Sandbox Code Playgroud)

Ste*_*fin 5

是的,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将在必要时创建置换矩阵以确保数值稳定性.