【发布时间】:2013-05-12 16:05:14
【问题描述】:
是否可以通过例如加速大型稀疏矩阵计算以最佳方式放置花括号?
我要问的是:我可以通过强制 Matlab 以指定的顺序(例如“从右到左”或类似的顺序)执行操作来加速以下代码吗?
我有一个稀疏的对称对称矩阵 H,它之前已经被分解,以及一个长度等于 H 的维度的稀疏向量 M。我想要做的是:
编辑:一些附加信息:H 通常为 4000x4000。 z 和 c 的计算大约进行了 4000 次,而 dVa 和 dVaComp 的计算每 4000 次循环进行 10 次,因此总共进行了 40000 次。 (迭代求解dVa和dVaComp,更新P_mis)。
这里M*c*M',会变成一个有4个非零元素的稀疏矩阵。在 Matlab 中:
[L U P] = lu(H); % H is sparse (thus also L, U and P)
% for i = 1:4000 % Just to illustrate
M = sparse([bf bt],1,[1 -1],n,1); % Sparse vector with two non-zero elements in bt and bf
z = -M'*(U \ (L \ (P * M))); % M^t*H^-1*M = a scalar
c = (1/dyp + z)^-1; % dyp is a scalar
% while (iterations < 10 && ~=converged)
dVa = - (U \ (L \ (P * P_mis)));
dVaComp = (U \ (L \ (P * M * c * M' * dVa)));
% Update P_mis etc.
% end while
% end for
并且记录一下:即使我多次使用 H 的倒数,预计算它也并不快。
谢谢 =)
【问题讨论】:
-
有几个问题:你说“
P是一个预定义的全向量”,但是你将它生成为一个与H大小相同的稀疏矩阵。此外,在“数学”z和实现的z之间,有一个减号不同。这让人有点不清楚你想要完成什么;您能否更正/澄清这些问题? -
感谢罗迪指出错误。 “预定义” P 现在更改为 P_mis,并且是一个失配向量,当找到 dVa 和 dVaComp 时,每次迭代都会更新。不要与置换矩阵P混淆。它应该是z前面的减号。
-
将 t 用于转置一次,将其用作变量有点令人困惑。顺便提一句。我记得很清楚,如果你计算 M*M',Matlab 会有一些优化 - 因为 c 是标量,你应该能够在 dVaComp 中切换它。
标签: performance matlab sparse-matrix