Eigen - Создать разреженную матрицу с элементами вектора на k-й диагонали

В Эйгене asDiagonal Функция создает диагональную матрицу, используя вектор. Эта функция размещает элементы вектора только на главной диагонали.

Существует ли быстрый способ создания разреженной матрицы с элементами вектора на k-й диагонали?

Для примера для плотных матриц, используя положительный индекс для диагоналей выше основного и отрицательный для нижних, я ожидал:

 Vector3i(2,5,6).asDiagonal(-1);

Производить:

 0 0 0 0
 2 0 0 0
 0 5 0 0
 0 0 6 0

Но asDiagonal не принимает аргументов
Я знаю способ сделать то, что я хочу, предполагая, что n длина вектора vect а также d диагональный индекс:

MartixXd m(n+abs(d),n+abs(d));
for (unsigned int i = 0; i < n; ++i)
   m.diagonal(d)[i] = vect(i);

Но, к сожалению, это не работает для разреженных матриц...

Итак, я закончил с этим:

SparseMatrix<double> m(n+abs(d),n+abs(d));
m.reserve(n);
if (d < 0)
{
   for (unsigned int l = 0; l < n; l++)
      m.coeffRef(l-d,l) = vect.coeffRef(l);
} else {
   for (unsigned int l = 0; l < n; l++)
      m.coeffRef(l,l+d) = vect.coeffRef(l);
}

Есть ли более быстрый и / или более элегантный способ сделать это?

0 ответов

Другие вопросы по тегам