繁体   English   中英

在Matlab中仅计算矩阵乘积的对角线

[英]compute only diagonal of product of matrices in Matlab

Matlab中是否有一种有效的方法来仅计算3(或更多)矩阵乘积的对角线? 具体来说我想要

diag(A'*B*A)

当A和B都非常大时,可能需要很长时间。 如果只有两个矩阵

diag(B*A)

然后我可以这样快速地做到这一点:

sum(B.*A',2)

所以现在我用这样的3个矩阵计算对角线:

C = B*A;
ans = sum(A'.*C',2);

这有很大帮助,但第一次操作(C = B * A)仍然需要很长时间。 整个事情也必须重复多次,导致我的代码运行数周。 例如,B约为15k×15​​k,A约为32k×15k。 没有什么是稀疏的。

首先,欢迎! 说实话,这似乎很难。 稍微改变至少会略微提高速度:

N = 5000;
A = rand(N,N*2);
B = rand(N,N);

t = cputime;
diag(A'*B*A);
disp(['Elapsed cputime ' num2str(cputime-t)]);

t=cputime;
C = B*A;
sum(A'.*C',2);
disp(['Elapsed cputime ' num2str(cputime-t)]);

% slightly better...
t=cputime;
C = B*A;
sum(A.*C)';
disp(['Elapsed cputime ' num2str(cputime-t)]);

% slightly better than slightly better...
t=cputime;
sum(A.*(B*A))';
disp(['Elapsed cputime ' num2str(cputime-t)]);

结果:

Elapsed cputime 82.2593
Elapsed cputime 28.6106
Elapsed cputime 25.8338
Elapsed cputime 25.7714

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM