c – 在Eigen中填充稀疏矩阵非常慢

我有这个代码在for循环中调用java中的c方法:

JNIEXPORT void JNICALL Java_com_jp_algi_CoreC_MMload(JNIEnv *env3, jobject clazz3, jdoubleArray inputv, jintArray inputi, jint poc, jint pozic)
{
    jdouble* fltv2 ;
    jint* fltind2;
    jsize sizedat = env3->GetArrayLength(inputi);
    fltv2  = new jdouble[sizedat];
    fltind2  = new jint[sizedat];
    jint i;
    jint jm;
    env3->GetIntArrayRegion(inputi,0,sizedat,fltind2);
    env3->GetDoubleArrayRegion(inputv,0,sizedat,fltv2);

    // default is column major
    matA.reserve(VectorXi::Constant(1,sizedat));

    for ( jm = 0; jm < sizedat; jm++) {
        //matA.insert(fltind2[jm],pozic) = fltv2[jm]; // alternative: mat.coeffRef(i,j) += v_ij;
        matA.insert(fltind2[jm],pozic)= fltv2[jm];
        //matA.insertBack(fltind2[jm],pozic)= fltv2[jm];
        //matA.ins
        //matA.insertBackUncompressed();
        //matA.coeffRef(fltind2[jm],pozic) += fltv2[jm];
        // optional
    }

    matA.makeCompressed();

    //k++; //blbe zayklenji!!!
    env3->SetIntArrayRegion(inputi,0,sizedat,fltind2);
    env3->SetDoubleArrayRegion(inputv,0,sizedat,fltv2);
    delete[] fltv2;
    delete[] fltind2;
}

其中inputv是matA列的值.和inputi是这些值的索引.

我在文档中读到了特征,插入函数是最快的,当非零系数的数量大约是5000时就可以了.但是当我有25000时,每列需要5秒!

我试过回复,但值是一样的吗?这个命令到底是做什么的?有没有办法改进这段代码?

一旦有利(可能):每列中的值和索引按从最高到最低的值排序……

解决方法:

如果稀疏矩阵很大,则必须在填充之前为matA分配足够的空间.否则,需要很长时间才能一次又一次地分配空间和复制数据.

您需要做的第一件事是了解矩阵的稀疏模式.稀疏模式的意思是每列的非零元素的数量(假设您的稀疏矩阵在列专业中).如果我们将这些值存储在VectorXi类型的变量V中,则调用matA.reserve(V)将分配足够的内存空间.

按照上述步骤,我可以使用普通笔记本电脑在30秒内填充47236×677399稀疏矩阵(#non-zeros:49556258).如果我不这样做,它需要永远……

上一篇:c – Boost :: fusion,Eigen和zip转换


下一篇:c – 如何从2个向量中创建特征矩阵