Как обернуть Eigen::SparseMatrix поверх существующих 3-стандартных сжатых массивов строк/столбцов

ПРИМЕЧАНИЕ. Я уже задавал этот вопрос, но он был закрыт из-за «слишком широкого» без особых объяснений. Я не понимаю, как этот вопрос может быть более конкретным (он касается определенного класса конкретной библиотеки для конкретного использования...), поэтому я предполагаю, что это было что-то вроде «ошибки модератора», и задаю его снова. ..

Я хотел бы выполнить умножение разреженной матрицы/матрицы, используя Eigen на разреженных матрицах. Эти матрицы уже определены в коде, над которым я работаю, в стандартном сжатом хранилище строк/столбцов с тремя массивами.

Затем я хотел бы использовать класс Eigen::SparseMatrix в качестве оболочки для этих массивов (при условии, что внутри Eigen используется такое хранилище с тремя массивами), чтобы избежать дублирования матриц в памяти. Я хотел бы сделать что-то вроде следующего:

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();

Возможно ли это и если да, то как?

Огромное спасибо


person janou195    schedule 06.11.2014    source источник
comment
Я уверен, что вы уже просмотрели документацию и увидели, что формат, используемый для разреженных матриц, немного отличается, используя 4 массива вместо 3. Вы, вероятно, также заметили, что в небольшом руководстве не упоминаются методы преобразования из 3 массивов в 4. Я полагаю, что самым простым способом будет пакетная вставка значений в разреженную матрицу, что позволит ей самостоятельно построить свой собственный внутренний формат.   -  person didierc    schedule 06.11.2014
comment
Вы ищете Eigen::MappedSparseMatrix: eigen.tuxfamily.org/dox/classEigenEigen::MappedSparseMatrix1MappedSparseMatrix.html   -  person ggael    schedule 06.11.2014
comment
Да, это похоже на то, что я ищу. Есть ли способ установить защищенные члены этого класса или мне нужно получить от него класс?   -  person janou195    schedule 12.11.2014


Ответы (1)


Как указал ggael, для этого можно использовать Eigen::MappedSparseMatrix.

Причина, по которой вы не можете просто перезаписать внутренние указатели SparseMatrix, заключается в том, что это вызовет проблемы, когда SparseMatrix освобождает их, но вы выделяете их другим способом, чем Eigen (и то, как Eigen внутренне выделяет память, является деталью реализации, которую вы должны на самом деле не полагаться в вашем коде).

person chtz    schedule 25.09.2016