gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:42:40 27 4
gpt4 key购买 nike

我有这段代码在 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,但值是一样的?这个命令到底做了什么?有什么方法可以改进这段代码吗?

一次优势(也许):每列中的值和索引按值从高到低排序......

最佳答案

如果你的稀疏矩阵很大,你必须在填充之前为 matA 分配足够的空间。否则,一遍又一遍地分配空间和复制数据将花费很长时间。

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

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

关于c++ - 在 Eigen 中填充稀疏矩阵非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17877243/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com