MATLAB有稀疏存储,但稀疏存储 在进行运算时也要还原满矩阵啊。用什么方法能让A尽量大但MATLAB还能算出。
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.