我有这个代码在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).如果我不这样做,它需要永远……