#include "picout.h" #include "pivector2d.h" #include "Eigen/Dense" typedef Eigen::MatrixXd PIMathMatrixd; typedef Eigen::MatrixXf PIMathMatrixf; typedef Eigen::MatrixXcf PIMathMatrixcf; typedef Eigen::MatrixXcd PIMathMatrixcd; template inline PICout operator <<(PICout s, const Eigen::DenseCoeffsBase & m) {s << '{'; for (uint r = 0; r < m.rows(); ++r) { for (uint c = 0; c < m.cols(); ++c) { s << m(r, c); if (c < m.cols() - 1 || r < m.rows() - 1) s << ", ";} if (r < m.rows() - 1) s << PICoutManipulators::NewLine << ' ';} s << '}'; return s;} template inline PIVector > toVectors(const Eigen::DenseCoeffsBase & m) { PIVector > ret; for(int i = 0; i < m.cols(); ++i) ret << PIVector(&(m(i*m.rows())), m.rows()); return ret; } template inline Eigen::Matrix fromVectors(const PIVector > & m) { if (m.isEmpty()) return Eigen::Matrix(0, 0); if (m[0].isEmpty()) return Eigen::Matrix(1, 0); Eigen::Matrix ret(m[0].size(), m.size()); for(int i = 0; i < m.size_s(); ++i) for(int j = 0; j < m[i].size_s(); ++j) ret(j,i) = m[i][j]; return ret; } template inline PIVector toPlainVector(const Eigen::DenseCoeffsBase & m) { return PIVector(&(m(0)), m.size()); } int main() { // Eigen::MatrixXd; // PIMathMatrix m1(2,2, PIVector() << complexd(1.) << complexd(1.) << complexd(0.) << complexd(1.)); // PIMathMatrix m2(2,3, PIVector() << complexd(2., 3.) << complexd(2., 3.) << complexd(2., 3.) << complexd(2., 3.) << complexd(2., 3.) << complexd(2., 3.)); PIMathMatrixd m1(3,3); m1 << 1,2,3,4,6,5,9,8,7; // PIMathMatrix m2(2,3, PIVector() << 1. << 2. << complexd(2., 3.) << complexd(2., 3.) << complexd(2., 3.) << complexd(2., 3.)); // PIMathMatrix m3(vv); // piCout << m2 << PICoutManipulators::NewLine; // piCout << (PIVector2D)m2 << PICoutManipulators::NewLine; // for (uint r = 0; r < m2.rows(); ++r) { // for (uint c = 0; c < m2.cols(); ++c) { //// piCout << m2[r][c]; // m2[r][c] = complexd(m2[r][c].real(), -(m2[r][c].imag())); //// m2[r][c] = complexd(); // } // } piCout << m1 << PICoutManipulators::NewLine; piCout << toPlainVector(m1); // piCout << m2 << PICoutManipulators::NewLine; // piCout << (PIVector2D)m2 << PICoutManipulators::NewLine; // piCout << m2.transposed() << PICoutManipulators::NewLine; // piCout << hermitian(m2) << PICoutManipulators::NewLine; // piCout << (m2*m1); // PIMathVector v(PIVector() << complexd(1.) << complexd(2.)); // piCout << (m1*PIMathMatrix::matrixCol(v));``` // piCout << m2; // piCout << m3; // bool ok; PIMathMatrixd mi = m1.inverse(); piCout << mi; piCout << PIMathMatrixd(mi * m1); piCout << m1.row(0); piCout << m1.row(1); piCout << m1.row(2); piCout << ""; piCout << m1.col(0); piCout << m1.col(1); piCout << m1.col(2); //m2 = m2.transposed(); // piCout << m2 << PICoutManipulators::NewLine << hermitian(m2); // piCout << PICoutManipulators::NewLine << hermitian(m2) * mi; // piCout << PICoutManipulators::NewLine << m1 * m2 << PICoutManipulators::NewLine << m2 * m1; // piCout << PICoutManipulators::NewLine << hermitian(m1*m2) << PICoutManipulators::NewLine << hermitian(m2) * hermitian(m1); // PIVector2D v(3,2); // for (uint r = 0; r < v.rows(); ++r) { // for (uint c = 0; c < v.cols(); ++c) { // piCout << r*v.cols()+c+1; // v[r][c] = r*v.cols()+c+1; // } // } // piCout << v; // for (uint c = 0; c < v.cols(); ++c) { // for (uint r = 0; r < v.rows(); ++r) { // piCout << r*v.cols()+c+1; // v[r][c] = -v[r][c]; // } // } piCout << "-------" << PICoutManipulators::NewLine; PIMathMatrixd v = m1.block(0,0, 3,2); m1 = v; // PIMathMatrixd v2 = m1.block(0,0, 2,3); // PIMathMatrixd v2(2,3, m1.toPlainVector().resize(6)); // piCout << v << PICoutManipulators::NewLine; piCout << m1 << PICoutManipulators::NewLine; PIVector > vv = toVectors(m1); piCout << vv << PICoutManipulators::NewLine; piCout << fromVectors(vv) << PICoutManipulators::NewLine; // piCout << toVectors(PIMathMatrixd(m1.transpose())) << PICoutManipulators::NewLine; // PIMathMatrix v2 = PIMathMatrix(v.toVectors()); // piCout << v2 << PICoutManipulators::NewLine; // piCout << v*v2 << PICoutManipulators::NewLine; // piCout << v2*v << PICoutManipulators::NewLine; return 0; }