2015-02-27 2 views
2

Типа разреженной матрицы в библиотеке Эйген C++, скажемЛучший способ обнулить коэффициенты sparsematrix в Eigen?

SparseMatrix<double, RowMajor> A; 

, кажется, отсутствует coeffFind (I, J) метод с InnerIterator или двойным * в качестве типа возвращаемого значения. Таким образом, чтобы гарантировать, что не имеет ненулевого коэффициента в позиции (I, J), я могу либо сделать

A.coeffRef(i,j) = 0.0; // Adds an entry with zero value! 

или

if (A.coeff(i,j) != 0.0) { 
    A.coeffRef(i,j) = 0.0; // Double look-up cost! 
} 

или написать свой собственный взгляд вверх метод, который будет дублирующим бинарный поиск, используемый внутри Eigen. Что мне делать?

+0

Вы правы, я последовал за «coeffRef» по ошибке. –

ответ

0

Я бы пошел писать самостоятельно, если производительность критическая (достаточно важная). В противном случае, на основе только сложности:

  1. просмотрова представляет собой О (журнал (NNZ))
  2. вставка (O (1) или О (NNZ), в зависимости от того, где она вставлена ​​- также оставляет больше памяти если матрица сжимается)

Таким образом, затраты на O (nnz) всегда для второго варианта или O (log (nnz)) для первого, если нет элемента. Если есть элемент, стоимость будет в два раза выше (log (nnz)), так что ваше сохранение O (log (nnz)) не будет значительным относительно вставки во втором методе. Если это действительно важно, тогда напишите свое.

+0

Какой путь выполнения приводит к добавлению нулей в A.coeff (i, j)? Я вижу coeff (...) в Eigen/src/SparseCore/SparseMatrix.h, вызывающий atInRange (...) из Eigen/src/SparseCore/CompressedStorage.h и возвращающий Scalar (0.0), если не найден. – user2646234

+0

Извините, мой Плохо. Я следовал за коэффициентом. –