本征稀疏矩阵中非零元素的数量 - 二元运算符不变
Number of non zeros elements in Eigen sparse matrix after - binary operator not changing
SparseMatrix<int,RowMajor> sm(3,3),sm1;
sm.insert(0,0)=1;
sm.insert(1,1)=1;
sm.insert(2,2)=1;
sm.insert(1,2)=1;
sm.insert(2,1)=1;
SparseMatrix<int,RowMajor> I(3,3);
I.insert(0,0)=1;
I.insert(1,1)=1;
I.insert(2,2)=1;
cout<<"SM matrix \n"<<sm<<endl;
sm1=sm-I;
cout<<"SM1 Matrix"<<sm1<<endl;
cout<<"the number of nonzeros\n"<<sm1.nonZeros()<<endl;
输出
SM matrix
Nonzero entries:
(1,0) (_,_) (1,1) (1,2) (1,1) (1,2)
Outer pointers:
0 2 4 $
Inner non zeros:
1 2 2 $
1 0 0
0 1 1
0 1 1
SM1 MatrixNonzero entries:
(0,0) (0,1) (1,2) (1,1) (0,2)
Outer pointers:
0 1 3 $
0 0 0
0 0 1 `
0 1 0
the number of nonzeros
5
sm1.nonZeros()
不查看矩阵的值,而是 returns 分配用于存储值的内部数组的大小:
/** \returns the number of non zero coefficients */
inline Index nonZeros() const
{
if(m_innerNonZeros)
return innerNonZeros().sum();
return static_cast<Index>(m_data.size());
}
如果您要在调试器中查看该数组或通过 sm1.valuePtr()
访问它,您会看到如下内容:
sm1.m_data.m_values == {0, 0, 1, 1, 0}
如果它是密集矩阵,您可以执行类似 (m1.array() != 0).count()
的操作,但这不适用于稀疏模块。解决方法是使用如下地图:
cout<<"the number of nonzeros with comparison: \n"
<< (Eigen::Map<Eigen::VectorXi> (sm1.valuePtr(), sm1.nonZeros()).array() != 0).count()
<< endl;
实际上将每个值与 0
进行比较并输出正确答案。
如果您确定不会添加修改新置零的值,您可以prune稀疏矩阵:
sm1.prune(1);
cout<<"the number of pruned nonzeros\n"<<sm1.nonZeros()<<endl;
这首先删除低于阈值的值(在本例中为 1),数据数组如下所示:
sm1.m_data.m_values == {1, 1}
SparseMatrix<int,RowMajor> sm(3,3),sm1;
sm.insert(0,0)=1;
sm.insert(1,1)=1;
sm.insert(2,2)=1;
sm.insert(1,2)=1;
sm.insert(2,1)=1;
SparseMatrix<int,RowMajor> I(3,3);
I.insert(0,0)=1;
I.insert(1,1)=1;
I.insert(2,2)=1;
cout<<"SM matrix \n"<<sm<<endl;
sm1=sm-I;
cout<<"SM1 Matrix"<<sm1<<endl;
cout<<"the number of nonzeros\n"<<sm1.nonZeros()<<endl;
输出
SM matrix
Nonzero entries:
(1,0) (_,_) (1,1) (1,2) (1,1) (1,2)
Outer pointers:
0 2 4 $
Inner non zeros:
1 2 2 $
1 0 0
0 1 1
0 1 1
SM1 MatrixNonzero entries:
(0,0) (0,1) (1,2) (1,1) (0,2)
Outer pointers:
0 1 3 $
0 0 0
0 0 1 `
0 1 0
the number of nonzeros
5
sm1.nonZeros()
不查看矩阵的值,而是 returns 分配用于存储值的内部数组的大小:
/** \returns the number of non zero coefficients */
inline Index nonZeros() const
{
if(m_innerNonZeros)
return innerNonZeros().sum();
return static_cast<Index>(m_data.size());
}
如果您要在调试器中查看该数组或通过 sm1.valuePtr()
访问它,您会看到如下内容:
sm1.m_data.m_values == {0, 0, 1, 1, 0}
如果它是密集矩阵,您可以执行类似 (m1.array() != 0).count()
的操作,但这不适用于稀疏模块。解决方法是使用如下地图:
cout<<"the number of nonzeros with comparison: \n"
<< (Eigen::Map<Eigen::VectorXi> (sm1.valuePtr(), sm1.nonZeros()).array() != 0).count()
<< endl;
实际上将每个值与 0
进行比较并输出正确答案。
如果您确定不会添加修改新置零的值,您可以prune稀疏矩阵:
sm1.prune(1);
cout<<"the number of pruned nonzeros\n"<<sm1.nonZeros()<<endl;
这首先删除低于阈值的值(在本例中为 1),数据数组如下所示:
sm1.m_data.m_values == {1, 1}