ПРИМЕЧАНИЕ: я уже задавал этот вопрос, но он был закрыт из-за «слишком широкого» без особых объяснений. Я не понимаю, как этот вопрос может быть более конкретным (он касается определенного класса конкретной библиотеки для определенного использования …), поэтому я предполагаю, что это было что-то вроде «ошибки модератора», и задаю его снова. ..
Я хотел бы выполнить умножение разреженных матриц / матриц, используя Eigen на разреженных матрицах. Эти матрицы уже определены в коде, над которым я работаю, в стандартном сжатии строк / столбцов с 3 массивами.
Затем я хотел бы использовать класс Eigen :: SparseMatrix в качестве оболочки для этих массивов (предполагая, что внутри Eigen использует такое хранилище из 3 массивов), чтобы избежать дублирования матриц в памяти. Я хотел бы сделать что-то вроде следующего:
Eigen::SparseMatrix smin0(n,m);
Eigen::SparseMatrix smin1(m,l);
Eigen::SparseMatrix smout(n,l);
smin0.set_innerPtr(myInnerPtr0);
smin0.set_outerPtr(myOuterPtr0);
smin0.set_valuePtr(myValuePtr0);
smin1.set_innerPtr(myInnerPtr1);
smin1.set_outerPtr(myOuterPtr1);
smin1.set_valuePtr(myValuePtr1);
smout=smin0*smin1;
int *myOutInnerPtr=smout.innerIndexPtr();
int *myOutOuterPtr=smout.outerIndexPtr();
double *myOutValuePtr=smout.valuePtr();
Возможно ли это, и если да, то как?
Большое спасибо
Как указал Ггаэль, вы можете использовать Эйген :: MappedSparseMatrix для этого.
Причина, по которой вы не можете просто перезаписать внутренние указатели SparseMatrix
является то, что это может вызвать проблемы, когда SparseMatrix
освобождает их, но вы распределили их не так, как это делает Eigen (а то, как Eigen внутренне выделяет память, является деталью реализации, на которую вы не должны полагаться в своем коде).