Ax=b,其中A是万阶稀疏矩阵,怎么求x,A用什么方法存储能让机算机不存储溢出。用MATLAB算。

MATLAB有稀疏存储,但稀疏存储 在进行运算时也要还原满矩阵啊。用什么方法能让A尽量大但MATLAB还能算出。

"但稀疏存储 在进行运算时也要还原满矩阵啊", That's not the truth. 如果打算深入研究的话你可以看看
Direct methods for sparse linear systems, by Tim Davis
Iterative Methods for Sparse Linear Systems

这两本书.

当使用 Matlab x = A\b 反斜杠操作时, 如果 A 是稀疏阵, 使用的针对稀疏阵的类似高斯消去法的直接求解算法. 使用这种算法会插入一些非零元, 使得存储量增加, 但不会使之成为 full matrix.

对于大型稀疏线性方程组求解, 如果MATLAB提示内存不足, 有两种解决方案, 1 是使用更大内存的计算机或者使用 out of core 的模式(我不清楚 matlab 是否有 out of core 的模式). 2. 你可以尝试稀疏矩阵的迭代法求解, 比如带有各种预处理的 gmres, cg 等方法. matlab 自带有 gmres 这个函数, 你也可以尝试一下.

当然, 无论是直接法还是迭代法, in core 还是 out of core, 32bit 的机器总有一个极限. 在这个时候, 你就只能采取使用 64bit 平台, 然后加大内存, 使用并行这些策略了. By the way, 对于真正的上百万阶, 千万阶的大型稀疏线性方程组来说, matlab 并不是最好的选择, 你还是应该寻求 Fortran, C 这些更高效的语言.追问

S=sparse(A);
v=Gauss_Seidel_iterative(S,b);
我把A转化为sparse存储 再用Gauss-Seidel求Sx=b好像也没什么效果

追答

大型稀疏矩阵,不是这么构造的. 你这种算法还是需要存储 full matrix 的,

一种解决方法是先构造三元组, 然后一次性转换为 sparse matrix
具体用法 help sparse 即可

追问

我用spdiags构造了稀疏矩阵 如果A\b A是三元组稀疏矩阵,Matlab是怎么求解的呢 ? 它不需要还原full matric再求?

追答

关于 A\b 见第一次回答. 我想我应该说得很清楚了. matlab 存储稀疏阵只有一种和三元组不同的自己的格式(maybe calld 'ELL', i'm not sure), 所以在matlab中, 不存在"A是三元组稀疏矩阵"这种说法. 另外, 你可以粗略了解一下稀疏矩阵的存储策略, 比如COO,CSR等.

MATLAB 中使用三元组构造稀疏矩阵的原因和方法参照
http://blogs.mathworks.com/loren/2007/03/01/creating-sparse-finite-element-matrices-in-matlab/
不过你既然使用带状来构造也没太大问题. 只是存储量可能更大一些(because some zeros will be stored as 'non-zeros').

我之前的意思是 S=sparse(A); 这个写起来是对的, 但用起来是不对的, 既然已经能够存储一个full 的 A了, 那再存个sparse(A) 就应该是基本上没问题的, 同样计算也可以进行下去, 所以用这个代码测试是没有意义的. 你之前说"好像也没什么效果" 是什么意思呢, 是哪一步出错, 出了什么错误, 应该说清楚.

最后, 如果使用带状存储的话你的稀疏性是多少有没有测试过? 实际需要多少内存? 如果使用COO格式呢? 你的电脑可用内存是多少? 这些问题你都需要仔细考虑过. 如此你可以粗略估计一下你的电脑能否承担这样的存储量. 算一笔账, 万阶矩阵 full storage 的话, 假如每个实数用双精度(matlab defaults), 需要内存为 10000*10000*16bits, 假设稀疏性为 0.1%, 在 matlab 中用COO存储的话, 需要 ia(1E8*0.001),ja(1E8*0.001),A(1E8*0.001), 共3*1e5*16 bits, 那也需要4.8G 左右, 更何况你还用的是带状矩阵存储方案.

so, 套用一句老外的话, you should consider it carefully before asking.

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答