Ошибка в CoeffRef собственной разреженной матрицы с элементами типа вектора - PullRequest
0 голосов
/ 29 апреля 2019

Я определяю разреженную матрицу как Eigen::SparseMatrix< Eigen::Matrix<float, 3, 1> >, что означает, что каждый элемент матрицы является вектором 3x1.Однако, когда я вызываю функцию CoeffRef для назначения вектора на элементы, я получаю следующую ошибку в SparseMatrix.h:

no operator "=" matches these operands. 

, и ошибка происходит от функции insert, тогда какон присваивает int для Eigen::Matrix< float, 3, 1>, то есть m_data.value(p) = 0 (учитывая, что m_data.value(p) - это вектор 3x1, а 0 - целое).

Кажется, что в этой строке кода (строка 1235 изSparseMatrix.h), они не принимали во внимание тип матрицы матрицы для сравнения.

Мне было интересно, есть ли у вас какие-либо идеи для решения этой ошибки?

typedef Eigen::Matrix< float, 3, 1> Vec3f;

Eigen::SparseMatrix< Vec3f > lA( m, n);
lA.reserve( Eigen::VectorXi::Constant(m, 4) );

for( unsigned int i = 0; i < m; i++)
{

   Vec3f lVec( 0.0, 0.0, 1.0);

   lA.coeffRef(i, i) = lVec; // got the error here!
}

1 Ответ

0 голосов
/ 29 апреля 2019

Это потому, что coeffRef пытается инициализировать вновь созданный элемент в 0, но 0 не может быть присвоен Vector3f. Таким образом, решение состоит в том, чтобы использовать Array3f вместо:

typedef Eigen::Array<float, 3, 1> Vec3f;

Конечно, имейте в виду, что оператор * ведет себя иначе на Array, чем на вектор и матрицы.

...