| MatrixXf A = MatrixXf::Random(4, 4); |
| MatrixXf B = MatrixXf::Random(4, 4); |
| RealQZ<MatrixXf> qz(4); // preallocate space for 4x4 matrices |
| qz.compute(A, B); // A = Q S Z, B = Q T Z |
| |
| // print original matrices and result of decomposition |
| cout << "A:\n" |
| << A << "\n" |
| << "B:\n" |
| << B << "\n"; |
| cout << "S:\n" |
| << qz.matrixS() << "\n" |
| << "T:\n" |
| << qz.matrixT() << "\n"; |
| cout << "Q:\n" |
| << qz.matrixQ() << "\n" |
| << "Z:\n" |
| << qz.matrixZ() << "\n"; |
| |
| // verify precision |
| cout << "\nErrors:" |
| << "\n|A-QSZ|: " << (A - qz.matrixQ() * qz.matrixS() * qz.matrixZ()).norm() |
| << ", |B-QTZ|: " << (B - qz.matrixQ() * qz.matrixT() * qz.matrixZ()).norm() |
| << "\n|QQ* - I|: " << (qz.matrixQ() * qz.matrixQ().adjoint() - MatrixXf::Identity(4, 4)).norm() |
| << ", |ZZ* - I|: " << (qz.matrixZ() * qz.matrixZ().adjoint() - MatrixXf::Identity(4, 4)).norm() << "\n"; |