大型矩阵的求逆--5000*5000
现在需要求解 大型矩阵,求逆大概有 5000 乘 5000维
大家一起讨论一下
用什么算法好?最节省时间? (关键是解决内存不足的问题,我的是2G内存,仍然不够用)
[ 本帖最后由 penghust 于 2008-10-25 14:28 编辑 ]
回复 楼主 penghust 的帖子
试试inv,如果可以使用的话应该是比较快的方法了。因为matlab的内置函数一般是经过优化的,可以获得比较好的效率。回复 沙发 sogooda 的帖子
只能算到 3000多维4000以上就不行了,内存不足
关键是解决内存的问题 分块。
回复 地板 sogooda 的帖子
谢谢,我尝试一下用 你的方法。关于内存管理,
本版有一篇讨论挺好的,
大家可以看一下
http://forum.vibunion.com/forum/viewthread.php?tid=35912
回复 5楼 penghust 的帖子
如果采用分块的方式,而担心A-1太大的话,可以把它输出到一个文本文档里。这样就可以算出更大的矩阵的逆了——只是好像算出来在matlab中也不能直接使用,呵呵。 原帖由 sogooda 于 2008-10-25 14:40 发表 http://www.chinavib.com/forum/images/common/back.gif分块。
可以这样吗? why?
个人数学底子不好, 我仅用最简单2*2矩阵试了下
a=; a1=inv(a), a2=1./a
很明显a1与a2不同 a=;
所以a的逆应该是a1=。不是1./a,右上和左下的元素要换位置的。
还是不对,我再想想啊。
[ 本帖最后由 ChaChing 于 2009-11-9 09:42 编辑 ] 刚刚试了下, 使用rand随意产生一5000*5000矩阵, 然後再inv
可以哪! 但是我使用的matlab是v5.6 & v6.5, 而且笔电的RAM是2G, 不知道有没有差!
又查了MATRIX处理的书, 好像并没有sogooda所提的方法, 我想sogooda记错笔误了 请问楼主处理什麽工程问题, 需要求这麽大的反矩阵? 可否说说学习学习!
个人浅见 :
其实以工程的角度看, 不外乎解决问题. 但解决问题的方式, 并不会仅有一种途径, 有时用换其他方式亦可能达成
其实解反矩阵的原由, 很多是为了解决AX=b方程的求解, 但并不一定要先求反矩阵
例如CFD基本上就是如上所述的问题, CFD动不动就几百万的cell, 其原始的AX=b方程若还是使用求反矩阵, 不是完了!
没给出解决方案, 也说了一堆, 楼上诸位见谅了
回复 楼主 penghust 的帖子
64位的matlab版本可以计算5000*5000的逆矩阵.虽然再大也可以算,但是仍是有上限的.回复 11楼 ChaChing 的帖子
我是自己编的一个有限元程序,划分的网格是 16* 16 *16 ,
得到的刚度矩阵 K是 4096 * 4096
如楼主所说,为了解决AX=b方程的求解
MATLAB 求解这样矩阵能力有限,
现在考虑,把刚度矩阵分块,或者导出到C++中进行求逆计算,
正在寻找合适的解决途径,也希望大家多多探讨。
回复 13楼 penghust 的帖子
我喜欢问清楚, 就是解决问题方式, 并不会仅有一种途径太久了有点模糊了, 不知道对不对
针对Ax=b的问题, 请楼主直接试试x=A\b是否可行!
回复 14楼 ChaChing 的帖子
对,当问题出现瓶颈时,尝试用不同的方法去解决,不失为解决问题之道
以前用x=A\b求解是,因为矩阵奇异,就换用 inv 求解,
一直没有改过,
刚刚又试了一下,
速度还挺快。没有出现内存不足的问题
谢谢仁兄提醒,
请求版主给他加分,很热心帮助论坛内兄弟。。 原帖由 penghust 于 2008-10-28 10:36 发表 http://www.chinavib.com/forum/images/common/back.gif
...以前用x=A\b求解是,因为矩阵奇异,就换用 inv 求解 ...
矩阵奇异了,即使换用 inv 应该也没用才对! 楼主笔误了吧!
其实inv及\在matlab上其所用的数值分析是不同, 所以会有如此差异!
很高兴自己多年前的经验, 竟还有用武之地!
页:
[1]
2