Sleipnir C++ API
Loading...
Searching...
No Matches
append_as_triplets.hpp
1// Copyright (c) Sleipnir contributors
2
3#pragma once
4
5#include <cstddef>
6#include <initializer_list>
7
8#include <Eigen/Core>
9#include <Eigen/SparseCore>
10#include <gch/small_vector.hpp>
11
12namespace slp {
13
25template <typename Scalar>
26void append_as_triplets(
27 gch::small_vector<Eigen::Triplet<Scalar>>& triplets, int row_offset,
28 int col_offset, std::initializer_list<Eigen::SparseMatrix<Scalar>> mats) {
29 // Compute row offset for each matrix
30 gch::small_vector<int> mat_row_offsets;
31 int mat_row_offset = 0;
32 for (const auto& mat : mats) {
33 mat_row_offsets.emplace_back(mat_row_offset);
34 mat_row_offset += mat.rows();
35 }
36
37 // Append elements in column-major order
38 for (int col = 0; col < mats.begin()[0].cols(); ++col) {
39 for (size_t i = 0; i < mats.size(); ++i) {
40 for (typename Eigen::SparseMatrix<Scalar>::InnerIterator it{
41 mats.begin()[i], col};
42 it; ++it) {
43 triplets.emplace_back(row_offset + mat_row_offsets[i] + it.row(),
44 col_offset + it.col(), it.value());
45 }
46 }
47 }
48}
49
57template <typename Scalar>
58void append_diagonal_as_triplets(
59 gch::small_vector<Eigen::Triplet<Scalar>>& triplets, int row_offset,
60 int col_offset, const Eigen::Vector<Scalar, Eigen::Dynamic>& diag) {
61 for (int row = 0; row < diag.rows(); ++row) {
62 triplets.emplace_back(row_offset + row, col_offset + row, diag[row]);
63 }
64}
65
66} // namespace slp