这次,我需要进行c#与MATLAB2012混编,建立的模型是附有限制条件的间接平差。刚开始,我还是充满信心的,毕竟可以依照师姐的步骤。然而,事实是残忍的,让我不断的调试代码,摸索稀疏矩阵的真正用处。代码的框架写好,一运行发现各种bug!记得一个bug是内存不足!当时,我就疑惑,为何同样的数据量,师姐的代码可以运行,甚至更大的数据量,也可以照常运行。然而,我的各种提示,内存不足。好的吧!我就开始改虚拟内存,心想这次应该可以了。事实上,并非没有解决成功!偶然之中,我发现问题是我吧平常的矩阵与稀疏矩阵一起使用了,即sparse与full的混淆,导致内存不足。
稀疏矩阵与普通矩阵,不能一起使用。因为使用稀疏矩阵的目的在于减少内存的使用率和提高运行的时间,而使用普通矩阵,也就是全矩阵(full),内存占用率高,甚至出现内存不足与代码运行时间久。因此,两者无法联合使用。
稀疏矩阵的创建:
1.sparse(a)
a为一个常规矩阵,即a=[0,2,3;4,5,0]
2.sparse(m,n)
mn分别是行列数,创建mn的零稀疏矩阵
3 .稀疏矩阵的串联(也就是合并)
首先,利用find函数,找出稀疏矩阵的存量
[i,j,s]=find(a),假如a是稀疏矩阵,则i,j分别指非零值的行列值,s就是非零值的本身。
假如两个稀疏矩阵a,b合并,创建更加大的稀疏矩阵,通过find函数,分别找出a,b的行列数与值,就可以重新构建一个稀疏矩阵,用sparse
,aa=sparse(i,j,s,m,n),此处是将稀疏矩阵a的值赋给更大的矩阵aa,ij是a原本的行列数,s也是。稀疏矩阵b,也是这样的操作,bb=sparse(i,j,s,m,n),其中,ijs都是b的原本的数。然后aa+bb就是所谓的矩阵相加。还有,[aa;bb],变成一个mn的稀疏矩阵。
4.外部文件的导入创建稀疏矩阵
首先,用load函数加载文件,然后用spconvert转换变成稀疏矩阵。
5.稀疏矩阵求逆
我尝试用了pinv,不行,只能用左除或者右除可以。
推荐博客:
https://wenwen.sogou.com/z/q191221944.htm?fr=wap&_t=47359
http://www.cnblogs.com/lihuidashen/p/3435883.html
https://ww2.mathworks.cn/help/matlab/ref/spconvert.html
https://jingyan.baidu.com/article/6181c3e08a4d6f152ef15333.html
https://ww2.mathworks.cn/help/matlab/math/sparse-matrix-operations.html