我有这样的代码,其调用C++方法在Java在for循环中:灌装在本征稀疏矩阵是非常慢
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秒!
我试过insrtback,但值是一样的吗?这个命令究竟做了什么?有什么方法可以改善此代码吗?
一旦优势(也许):每列中的值和索引是通过从最高到最低值进行排序...
你是否用增加pozic值或随机模式来调用此函数?同样,如果该值按“从最高到最低”排序,则反转循环,使插入命令归结为简单推回。保留命令不正确。 – ggael
1.是的,增加; pozic从0到sizeA的matA列。下一个你的意思是储备com。采取从这种方法初始化方法matA.??????????????或什么coorect方式ow写保留命令? –
那么最快的是打电话预约(大小); matA.startVec(pozic); for ...(...)mat.insertBack(fltind2 [jm],pozic)= ...;确保fltind2 [jm]的顺序不断增加。 – ggael