声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2087|回复: 3

[编程技巧] 较大矩阵的处理

[复制链接]
发表于 2007-6-9 22:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我现在遇到这样一个问题:
我要求振型和固有频率,所以我用的命令H=inv(A)*B; [V,h]=eig(H);其余的我就不一一罗嗦了.
现在真个程序我已经完成了,没有别的错误.现在唯一的问题就是由于矩阵A和B导致程序的运行速度太慢了.
其中A=[m,o;m,c];%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的大部分也是零元素,不太复杂.
程序中我用到了几个循环,但已经被我压缩到最少了,应该不是循环的问题.
回复
分享到:

使用道具 举报

发表于 2007-6-9 23:02 | 显示全部楼层
inv()最耗时了,对于更大维数的矩阵求逆,有没有优化算法,或者分解为可并行的代码?
发表于 2007-6-9 23:42 | 显示全部楼层
原帖由 gh688 于 2007-6-9 22:42 发表
我现在遇到这样一个问题:
我要求振型和固有频率,所以我用的命令H=inv(A)*B; [V,h]=eig(H);其余的我就不一一罗嗦了.
现在真个程序我已经完成了,没有别的错误.现在唯一的问题就是由于矩阵A和B导致程序的运行速度 ...


用 / (或者 \,忘记了),不要使用 inv 试试
发表于 2007-6-10 08:17 | 显示全部楼层
稀疏矩阵求逆可以试试基于krylov子空间方法的算法
如arnoldi和GMRES方法
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-12 10:50 , Processed in 0.054488 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表