Я пытаюсь использовать 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 ++?
Я только что нашел этот урок, метод в первом абзаце выглядит так, как вы искали.
@ wirew0rm
Метод, упомянутый в ссылке, тривиален и неэффективен.
На самом деле, я уже нашел решение, которое в основном изменяет содержимое унаследованного члена SparseMatrixRep.
Хотя в документации указано, что это небезопасно и не рекомендуется, производительность значительно улучшается.