5#include <initializer_list>
7#include <Eigen/SparseCore>
8#include <gch/small_vector.hpp>
23template <
typename Scalar>
24void append_as_triplets(
25 gch::small_vector<Eigen::Triplet<Scalar>>& triplets,
int row_offset,
26 int col_offset, std::initializer_list<Eigen::SparseMatrix<Scalar>> mats) {
28 gch::small_vector<int> mat_row_offsets;
29 int mat_row_offset = 0;
30 for (
const auto& mat : mats) {
31 mat_row_offsets.emplace_back(mat_row_offset);
32 mat_row_offset += mat.rows();
36 for (
int col = 0; col < mats.begin()[0].cols(); ++col) {
37 for (
size_t i = 0; i < mats.size(); ++i) {
38 for (
typename Eigen::SparseMatrix<Scalar>::InnerIterator it{
39 mats.begin()[i], col};
41 triplets.emplace_back(row_offset + mat_row_offsets[i] + it.row(),
42 col_offset + it.col(), it.value());
55template <
typename Scalar>
56void append_diagonal_as_triplets(
57 gch::small_vector<Eigen::Triplet<Scalar>>& triplets,
int row_offset,
58 int col_offset,
const Eigen::Vector<Scalar, Eigen::Dynamic>& diag) {
59 for (
int row = 0; row < diag.rows(); ++row) {
60 triplets.emplace_back(row_offset + row, col_offset + row, diag[row]);