30 #include <Eigen/Dense>
31 #include <Eigen/Eigenvalues>
41 assert(
A.rows() == C.rows());
42 assert(
B.rows() == C.cols());
50 const Eigen::MatrixXcd& T_A = A_schur.matrixT();
51 const Eigen::MatrixXcd& U_A = A_schur.matrixU();
52 const Eigen::MatrixXcd& T_B = B_schur.matrixT();
53 const Eigen::MatrixXcd& U_B = B_schur.matrixU();
55 const int n = C.rows();
56 const int m = C.cols();
59 Eigen::MatrixXcd F = U_A.adjoint() * C * U_B;
61 Eigen::MatrixXcd Y(
n, m);
66 Eigen::MatrixXcd lhs(
n, m);
72 for (
int k = 0; k < m; ++k)
74 Eigen::VectorXcd rhs = F.col(k) + T_A * Y * T_B.col(k);
77 const std::complex<double> factor = T_B(k, k);
84 Y.col(k) = lhs_svd.solve(rhs);
86 if (k < mm) lhs.setIdentity();
90 X = (U_A * Y * U_B.adjoint()).
real();
99 Eigen::VectorXcd eigvals_A =
A.eigenvalues();
100 Eigen::VectorXcd eigvals_B =
B.eigenvalues();
102 for (
int i = 0; i < eigvals_A.size(); ++i)
104 for (
int j = 0; j < eigvals_B.size(); ++j)
106 std::complex<double> product = eigvals_A[i] * eigvals_B[j];