gh688 发表于 2007-6-9 22:42

较大矩阵的处理

我现在遇到这样一个问题:
我要求振型和固有频率,所以我用的命令H=inv(A)*B; =eig(H);其余的我就不一一罗嗦了.
现在真个程序我已经完成了,没有别的错误.现在唯一的问题就是由于矩阵A和B导致程序的运行速度太慢了.
其中A=;%m是324x324的对角矩阵,o是324x324的零矩阵,m是324x324的对角矩阵,c是324x324的矩阵
      B=[-m,o;o,k];%m是324x324的对角矩阵,k是324x324的矩阵
A和B是648x648的矩阵,我实验的一下:计算A和B的1/4大约需要5分钟.
也就是计算:A(1:324,1:324);
                A(1:324,325:648);
                A(325:648,1:324);
                A(325:648,325:648);
                B(1:324,1:324);
                B(1:324,325:648);
                B(325:648,1:324);
                B(325:648,325:648);
其中每一个的计算大约是5分钟,而且计算的结果是正确的.
然后我开始计算A和B,结果一个下午才运行出结果.
然后我又用了一下稀疏矩阵sparse把A和B分别表示成稀疏矩阵的形式,结果matlab执行了快3个小时才算出来.
我现在就想:如果一个648x648的矩阵表示成稀疏矩阵的形式还要运行这样长的时间吗?
恳请各位指教.
另外我要指出的是矩阵c和K的大部分也是零元素,不太复杂.
程序中我用到了几个循环,但已经被我压缩到最少了,应该不是循环的问题.

w89986581 发表于 2007-6-9 23:02

inv()最耗时了,对于更大维数的矩阵求逆,有没有优化算法,或者分解为可并行的代码?

eight 发表于 2007-6-9 23:42

原帖由 gh688 于 2007-6-9 22:42 发表 http://www.chinavib.com/forum/images/common/back.gif
我现在遇到这样一个问题:
我要求振型和固有频率,所以我用的命令H=inv(A)*B; =eig(H);其余的我就不一一罗嗦了.
现在真个程序我已经完成了,没有别的错误.现在唯一的问题就是由于矩阵A和B导致程序的运行速度 ...

用 / (或者 \,忘记了),不要使用 inv 试试

happy 发表于 2007-6-10 08:17

稀疏矩阵求逆可以试试基于krylov子空间方法的算法
如arnoldi和GMRES方法
页: [1]
查看完整版本: 较大矩阵的处理