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

C++ 二元算子不变后特征稀疏矩阵中非零元素的个数,c++,eigen,eigen3,C++,Eigen,Eigen3,sm1.nonZeros()不查看矩阵的值,而是返回分配用于存储值的内部数组的大小: 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 po

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

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
如果它是密集矩阵,则可以执行类似于
(m1.array()!=0.count()
)的操作,但稀疏模块不起作用。解决方法是使用地图,如下所示:

sm1.m_data.m_values == {0, 0, 1, 1, 0}
首先删除阈值以下的值(本例中为1),数据数组如下所示:

sm1.prune(1);
cout<<"the number of pruned nonzeros\n"<<sm1.nonZeros()<<endl;

对不起,我打错了。我想把它打印出来。。我现在可以为您解决您的问题了-为了将来的参考,您可以点击上面的
edit
链接来纠正这样的错误。
sm1.m_data.m_values == {0, 0, 1, 1, 0}
cout<<"the number of nonzeros with comparison: \n"
    << (Eigen::Map<Eigen::VectorXi> (sm1.valuePtr(), sm1.nonZeros()).array() != 0).count()
    << endl;
sm1.prune(1);
cout<<"the number of pruned nonzeros\n"<<sm1.nonZeros()<<endl;
sm1.m_data.m_values == {1, 1}