1#ifndef MATRIX_ALGEBRA_H
2#define MATRIX_ALGEBRA_H
4#include <eigen3/Eigen/Eigen>
16Eigen::MatrixXd kron(
const Eigen::MatrixXd &m1,
const Eigen::MatrixXd &m2) {
17 uint32_t m1r = m1.rows();
18 uint32_t m1c = m1.cols();
19 uint32_t m2r = m2.rows();
20 uint32_t m2c = m2.cols();
22 Eigen::MatrixXd m3(m1r * m2r, m1c * m2c);
24 for (
int i = 0; i < m1r; i++) {
25 for (
int j = 0; j < m1c; j++) {
26 m3.block(i * m2r, j * m2c, m2r, m2c) = m1(i, j) * m2;
41Eigen::MatrixXd block_diag(
const Eigen::MatrixXd &m1,
42 const Eigen::MatrixXd &m2) {
43 uint32_t m1r = m1.rows();
44 uint32_t m1c = m1.cols();
45 uint32_t m2r = m2.rows();
46 uint32_t m2c = m2.cols();
48 Eigen::MatrixXd mf = Eigen::MatrixXd::Zero(m1r + m2r, m1c + m2c);
49 mf.block(0, 0, m1r, m1c) = m1;
50 mf.block(m1r, m1c, m2r, m2c) = m2;
64Eigen::MatrixXd block_diag(
const Eigen::MatrixXd &m1,
const Eigen::MatrixXd &m2,
65 const Eigen::MatrixXd &m3) {
66 uint32_t m1r = m1.rows();
67 uint32_t m1c = m1.cols();
68 uint32_t m2r = m2.rows();
69 uint32_t m2c = m2.cols();
70 uint32_t m3r = m3.rows();
71 uint32_t m3c = m3.cols();
73 Eigen::MatrixXd bdm = Eigen::MatrixXd::Zero(m1r + m2r + m3r, m1c + m2c + m3c);
74 bdm.block(0, 0, m1r, m1c) = m1;
75 bdm.block(m1r, m1c, m2r, m2c) = m2;
76 bdm.block(m1r + m2r, m1c + m2c, m3r, m3c) = m3;
90Eigen::MatrixXd reshape(Eigen::MatrixXd x, uint32_t r, uint32_t c) {
91 Eigen::Map<Eigen::MatrixXd> rx(x.data(), r, c);