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 を試しましたが、値は同じですか? このコマンドは正確に何をしますか? このコードを改善する方法はありますか?
かつての利点(おそらく):すべての列の値とインデックスは、最高から最低までの値でソートされます...