Как эффективно обновить записи собственных разреженных матриц - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть фиксированная разреженная матрица, которую я настроил перед моими вычислениями:

Eigen::SparseMatrix<double, Eigen::ColMajor> A;
std::vector<Eigen::Triplet<double>> coefficients{
    {0, 0}//, {,},{,},{,}
};
A.setFromTriplets(coefficients.begin(), coefficients.end());
A.makeCompressed();

Теперь мне нужно обновить ее фактическими записями.К сожалению, просматривая записи с:

for(...) A.coeffRef(i,j) = new_val(i,j);

Я получаю бинарный поиск вместо эффективного доступа с постоянным временем.

Я мог бы использовать valuePtr(), но это кажется немного "Hacky».

1 Ответ

0 голосов
/ 07 декабря 2018

Один из способов - использовать итераторы и обновлять записи:

for (int k=0; k<A.outerSize(); ++k)
  for (SparseMatrix<double>::InnerIterator it(A,k); it; ++it)
    it.valueRef() = new_val(it.row(), it.col());

В моем случае я могу развернуть циклы и вручную заполнить каждую запись в коде:

A.coeffs()[0] = new_val_0;
A.coeffs()[1] = new_val_1;
A.coeffs()[2] = new_val_2;
...

Имейте в виду, что это матрица с разреженными столбцами, поэтому она быстрая j и медленная i.Заполнение коэффициентов вручную требует учитывать этот факт.

...