我有这段代码在 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 是这些值的索引。
我在 eigen 的文档中读到,插入函数是最快的,当非零系数的数量约为 5000 时没关系。但是当我有 25000 时,每列需要 5 秒!
我试过insrtback,但值是一样的吗?这个命令具体是做什么的?有没有办法改进这段代码?
曾经的优势(也许):每列中的值和索引按从最高到最低的值排序......