Разреженная матричная конструкция с использованием Octave API для переполнения стека

Я пытаюсь использовать Octave C ++ API для решения разреженной линейной системы. Проблема, с которой я столкнулся, заключается в том, что я не могу найти эффективный способ построения разреженной линейной системы.

SparseMatrix A;
int dim,nnz;
// dim = dimension
// nnz = number of non-zero entry in the matrix A

/*
somehow assign the values for dim and nnz
*/

A = SparseMatrix ( dim, dim, nnz );

// row index array
int *pidx_r = new int[nnz];
// col index array
int *pidx_c = new int[nnz];
// value array
double *pval = new double[nnz];
// total number of nonzero elements
int tot;

/*
somehow assign values for pidx_r, pidx_c, pval and tot
*/

for ( int i = 0; i < tot; i++ )
A ( pidx_r[i], pidx_c[i] ) = pval[i];

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

Например, A=SparseMatrix(pidx_r,pidx_c,pval);

Однако я не могу найти какие-либо функции-члены для этого. По крайней мере, кажется, что наивная реализация — единственный подход.

Учитывая, что я подготовил матрицу в каком-либо формате, я хотел бы спросить, есть ли какой-нибудь метод для эффективного построения разреженной матрицы с использованием Octave API для C ++?

0

Решение

Я только что нашел этот урок, метод в первом абзаце выглядит так, как вы искали.

ссылка на сайт

0

Другие решения

@ wirew0rm
Метод, упомянутый в ссылке, тривиален и неэффективен.

На самом деле, я уже нашел решение, которое в основном изменяет содержимое унаследованного члена SparseMatrixRep.

Хотя в документации указано, что это небезопасно и не рекомендуется, производительность значительно улучшается.

0

По вопросам рекламы [email protected]