二元算子不变后特征稀疏矩阵中的非零元素个数

时间:2015-05-22 12:18:15

标签: c++ eigen eigen3

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

1 个答案:

答案 0 :(得分:1)

sm1.nonZeros()不会查看矩阵的值,而是返回分配给存储值的内部数组的大小:

/** \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}