2014-11-06 4 views
1

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

Я хотел бы перенести разреженное матричное/матричное умножение с использованием 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(); 

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

Большое спасибо

+0

Я уверен, что вы уже посмотрели документацию и увидели, что формат, используемый для разреженных матриц, несколько отличается, используя 4 массива вместо 3. Возможно, вы также отметили, что в небольшом учебнике не упоминаются методы преобразования из 3 массивов до 4. Я полагаю, что самым простым способом было бы вставить значения вставки в разреженной матрице, что позволило бы самому построить собственный внутренний формат. – didierc

+0

Вы ищете 'Eigen :: MappedSparseMatrix': http://eigen.tuxfamily.org/dox/classEigen_1_1MappedSparseMatrix.html – ggael

+0

Да, это выглядит как то, что я ищу. Есть ли способ «установить» защищенные члены этого класса или мне нужно вывести из него класс? – janou195

ответ

0

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

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