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);
}
Есть ли более быстрый и / или более элегантный способ сделать это?