30Spdiags(
const Eigen::MatrixBase<Derived> & data,
const Eigen::VectorXi & diags,
const int m = -1,
const int n = -1)
32 using Scalar =
typename Derived::PlainObject::Scalar;
33 using T = Eigen::Triplet<Scalar>;
35 if(diags.size() > data.rows()) {
36 throw std::invalid_argument(
"diags size is larger than rows of data.");
39 int row_size, column_size;
40 Eigen::SparseMatrix<Scalar> a;
41 std::vector<T> triplets;
43 row_size = (m <= 0) ? (
int)data.rows() : m;
44 column_size = (n <= 0) ? (
int)data.cols() : n;
46 a.resize(row_size, column_size);
47 triplets.resize(row_size * diags.size());
49 for (
int k = 0; k < diags.size(); k++) {
50 int start_index = std::max(0, diags(k));
51 int end_index = std::min((
int)data.cols(), column_size);
53 for(
int i = start_index; i < end_index; i++) {
54 if(i - diags(k) < row_size && i < column_size) {
55 triplets.emplace_back(i - diags(k), i, data(k, i));
60 a.setFromTriplets(triplets.begin(), triplets.end());
77Spdiags(
const Eigen::MatrixBase<Derived> & data,
const std::vector<int> & diags,
const int m = -1,
const int n = -1)
81 Eigen::Map<Eigen::VectorXi>((
int *)diags.data(), diags.size()),
98Spdiags(
const Eigen::MatrixBase<Derived> & data,
const std::initializer_list<int> & diags,
const int m = -1,
const int n = -1)
100 return Spdiags(data, std::vector<int>{diags}, m, n);
Eigen::SparseMatrix< typename Derived::PlainObject::Scalar > Spdiags(const Eigen::MatrixBase< Derived > &data, const Eigen::VectorXi &diags, const int m=-1, const int n=-1)
Returns a sparse matrix with the specified elements on its diagonals.