Как я могу инициализировать SparseVector в Eigen

Как я могу инициализировать SparseVector в Eigen? Следующий код:

#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET
#include <Eigen/Sparse>
using namespace Eigen;
SparseVector<float> vec(3);
main()
{
  vec(0)=1.0;
}

дает мне следующую ошибку

ошибка: вызов объекта типа класса без соответствующего оператора() или функций преобразования в тип указатель на функцию vec(0)=1.0;

кстати, vec[0]=1.0 тоже не работает.


person Tarek    schedule 22.09.2011    source источник
comment
Никогда не слышал об Eigen, но бегло взглянув на документацию, я заметил coeffRef, вы пробовали также vec.coeffRef(0) = 1.0?   -  person HostileFork says dont trust SE    schedule 22.09.2011
comment
Большое спасибо. Это действительно способ вставки в SparseVector.   -  person Tarek    schedule 22.09.2011
comment
Ладно, тогда я отвечу так...   -  person HostileFork says dont trust SE    schedule 22.09.2011


Ответы (1)


Глядя на документацию, я заметил Scalar& coeffRef(Index i), и там написано:

Возвращает ссылку на значение коэффициента по заданному индексу i. Эта операция включает в себя бинарный поиск log(rho*size). Если коэффициент еще не существует, то выполняется сортированная вставка в последовательный буфер. (Эта вставка может быть очень дорогостоящей, если количество ненулевых элементов над i велико.)

Итак, должно работать следующее:

#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET
#include <Eigen/Sparse>
using namespace Eigen;
SparseVector<float> vec(3);
main()
{
    vec.coeffRef(0)=1.0;
}

Не уверен, почему они сделали это именно так, вместо того, чтобы использовать перегрузку массива. Возможно, когда он станет IS_STABLE, они сделают это более типичным способом C++?

person HostileFork says dont trust SE    schedule 22.09.2011
comment
Я думаю, они хотели, чтобы пользователи знали о потенциально дорогостоящей операции. - person eudoxos; 25.09.2011
comment
Да, но это просто неправильный синтаксис. Обычно вы не назначаете возвращаемое значение вызова функции. - person bobobobo; 06.11.2012
comment
Я согласен с bobobobo, что текущий интерфейс просто сбивает с толку. Я нашел этот веб-сайт, потому что очевидный синтаксис не работал. Это признак того, что интерфейс немного тупой (не говоря уже о многословном). - person Joe; 21.07.2013