c – 具有可参数化“零”的稀疏矩阵类

前端之家收集整理的这篇文章主要介绍了c – 具有可参数化“零”的稀疏矩阵类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在对日志域中的浮点稀疏矩阵进行一些计算,因此“空”条目实际上是-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";
}

猜你在找的C&C++相关文章