template<typename MatrixType> void eigensolver_verify_assert(const MatrixType& m) { ComplexEigenSolver<MatrixType> eig; VERIFY_RAISES_ASSERT(eig.eigenvectors()); VERIFY_RAISES_ASSERT(eig.eigenvalues()); MatrixType a = MatrixType::Random(m.rows(),m.cols()); eig.compute(a, false); VERIFY_RAISES_ASSERT(eig.eigenvectors()); }
int main(int, char**) { cout.precision(3); MatrixXcf A = MatrixXcf::Random(4,4); cout << "Here is a random 4x4 matrix, A:" << endl << A << endl << endl; ComplexEigenSolver<MatrixXcf> ces; ces.compute(A); cout << "The eigenvalues of A are:" << endl << ces.eigenvalues() << endl; cout << "The matrix of eigenvectors, V, is:" << endl << ces.eigenvectors() << endl << endl; complex<float> lambda = ces.eigenvalues()[0]; cout << "Consider the first eigenvalue, lambda = " << lambda << endl; VectorXcf v = ces.eigenvectors().col(0); cout << "If v is the corresponding eigenvector, then lambda * v = " << endl << lambda * v << endl; cout << "... and A * v = " << endl << A * v << endl << endl; cout << "Finally, V * D * V^(-1) = " << endl << ces.eigenvectors() * ces.eigenvalues().asDiagonal() * ces.eigenvectors().inverse() << endl; return 0; }
vector<complex<float> > PMS(vector<vector<complex<float> >> CSC_array) { int CSC_size = (int)CSC_array.size(); int array_size = 0; int i; int m,n; vector<vector< complex<float>> > Product_mat; vector<vector< complex<float>> > S_Z; vector<complex<float> > temp_mat; vector<complex<float> > Major_eigen_vector; complex<float> mat_ij_1; complex<float> mat_ij_2; complex<float> scalar(0,0); S_Z.resize(40, vector< complex<float>>(40, 0)); for (m = 0; m<40; m++) { for (n = 0; n<40; n++) { S_Z[m][n] = 0; } } for(i=0; i<period; i++) { array_size = (int)(CSC_array[i]).size(); for(m=0; m<array_size; m++) { mat_ij_1 = CSC_array[i][m]; scalar = scalar + mat_ij_1*conj(mat_ij_1); for(n=0; n<array_size; n++) { mat_ij_2 = CSC_array[i][n]; mat_ij_2 = conj(mat_ij_2); temp_mat.push_back(mat_ij_1*mat_ij_2); } Product_mat.push_back(temp_mat); temp_mat.clear(); } for(m=0; m<array_size; m++) { for(n=0; n<array_size; n++) { Product_mat[m][n] = Product_mat[m][n]/scalar; } } for(m=0; m<array_size; m++) { for(n=0; n<array_size; n++) { S_Z[m][n] = S_Z[m][n] + Product_mat[m][n]; } } scalar = 0; Product_mat.clear(); } MatrixXcf temp(array_size,array_size); MatrixXcf evec(array_size,array_size); MatrixXcf eval(array_size,1); for(m=0; m<array_size; m++) { for(n=0; n<array_size; n++) { temp(m,n) = S_Z[m][n]; } } ComplexEigenSolver<MatrixXcf> ces; ces.compute(temp); evec = ces.eigenvectors(); eval = ces.eigenvalues(); //cout << " Eigen " << eval(0,0) << endl; //cout << " EE " << evec(0,0) << endl; float Max_eigen=0.0; int Max_eigen_index=0; float temp_value=0.0; for(i=0; i<array_size; i++) { temp_value = norm( (i,0)); if(temp_value > Max_eigen) { Max_eigen = temp_value; Max_eigen_index = i; } } /* cout << "The eigenvector of temp are" << endl << evec << endl; cout << "The eigenvalue of temp are" << endl << eval << endl; cout << "Max eigenvalue " << endl << Max_eigen << endl; cout << "Max eigenvalue index " << endl << Max_eigen_index << endl; cout << "Max eigenvector " << endl << Max_eigen*evec(i) << endl; */ for(i=0; i<array_size; i++) { Major_eigen_vector.push_back(evec(i, Max_eigen_index)); //Major_eigen_vector.push_back(Max_eigen*evec(i,Max_eigen_index)); //cout << Major_eigen_vector[i] << endl; } return Major_eigen_vector; }