Eigen构造稀疏矩阵,这里我们对稀疏矩阵采用三元组的存储方式,即用(i,j,value(i,j))这样的组合把非零元的位置和值表示出来。废话不多说,我们直接上例子
#include "iostream"
#include "Eigen/SparseCore"
using namespace std;
using namespace Eigen;
int main()
//我们需要生成的矩阵
/****************
0 1 0 0 0
0 0 0 2 0
1 0 0 0 0
0 0 0 0 3
0 0 0 0 0
***************/
{
SparseMatrix<double> A(5,5);
vector < Triplet <double> >triplets;
// 初始化非零元位置,r表示行,c表示列,默认列优先。
int r[4]={2,0,1,3};
int c[4]={0,1,3,4};
double value[]={1,1,2,3}; //给非零元赋值
for (int i=0;i<4;i++)
triplets.emplace_back(r[i],c[i],value[i]);
//初始化矩阵
A.setFromTriplets (triplets.begin(),triplets.end());
cout <<"A="<<endl<<A<<endl;
}
输出结果
wanghai@de4f88556b1b:~/wanghai/build$ ./SMatrix
A=
Nonzero entries:
(1,2) (1,0) (2,1) (3,3)
Outer pointers:
0 1 2 2 3 $
0 1 0 0 0
0 0 0 2 0
1 0 0 0 0
0 0 0 0 3
0 0 0 0 0
这样我们轻松的得到了一个稀疏矩阵。
此外我们对稀疏矩阵还有很多其他操作能得到关于矩阵的很多信息,例如
sm1.rows(); // 行数
sm1.cols(); // 列数
sm1.nonZeros(); // 非零值的数量
sm1.outerSize(); // 列主要(相应的行主要)的列数(相应的行)
sm1.innerSize(); // 行数(列数)的行数(列数)
sm1.norm(); // 矩阵的欧几里德范数
sm1.squaredNorm(); // 矩阵的平方范数
sm1.blueNorm();
sm1.isVector(); // 检查 sm1 是稀疏向量还是稀疏矩阵
sm1.isCompressed(); // 检查 sm1 是否为压缩形式
参考链接
http://eigen.tuxfamily.org/dox/group__SparseQuickRefPage.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)