我正在对日志域中的浮点稀疏矩阵进行一些计算,因此“空”条目实际上是-Inf(使用-FLT_MAX).我现在正在使用一个自定义的稀疏矩阵类,但我渴望在现成的替换中进行交换.
这是在C.我倾向于看Eigen和Boost uBlas中的压缩列矩阵.但是,不清楚是否支持“零”的自定义值(可能由模板参数提供).有人有建议吗?
澄清:
我想要的是:对于以前没有“设置”的任何单元格(i,j),我希望mat [i,j]返回-Inf …所以这可能更好地描述为“默认”稀疏矩阵的“空”条目的值.
我正在使用它执行HMM递归(Viterbi,sum-product),其概率保留在日志域中以避免下溢.
我没有做任何矩阵操作…我只是填充动态编程表,基本上.我想使用一个稀疏的矩阵类,因为我只是填充一个矩阵,我想要高效的内存使用.压缩频带矩阵将提供良好的性能,因为我按顺序填充矩阵.
解决方法
这样的东西怎么样?
class compressed_matrix_nonzero_default : public boost::numeric::ublas::compressed_matrix<double> { double def; public: compressed_matrix_nonzero_default( int s1,int s2 ) : boost::numeric::ublas::compressed_matrix<double>(s1,s2),def(0) { } void setDefault( double d ) { def = d; } double value( int i,int j ) { typedef boost::numeric::ublas::compressed_matrix<double>::iterator1 it1_t; typedef boost::numeric::ublas::compressed_matrix<double>::iterator2 it2_t; for (it1_t it1 = begin1(); it1 != end1(); it1++) { if( it1.index1() < i ) continue; if( it1.index1() > i ) { return def; } for (it2_t it2 = it1.begin(); it2 != it1.end(); it2++) { if( it2.index2() < j ) continue; if( it2.index2() == j ) return *it2; if( it2.index2() > j ) return def; } } return def; } };
compressed_matrix_nonzero_default MNZ(3,3); MNZ.setDefault(-100); MNZ (1,1) = 45; for( int i = 0; i < 3; i++ ) { for( int j = 0; j < 3; j++ ) { std::cout << MNZ.value(i,j) << ","; } std::cout << "\n"; }