1. 程式人生 > >基於eigen計算矩陣的特徵值和特徵向量

基於eigen計算矩陣的特徵值和特徵向量

有點小瑕疵,就是讀取檔案和生成檔案的位置!備註下本文是在Ubuntu系統下構建的,一些地方可能存在著差異。

1 首先是在如下的檔案下建立data.txt

 這個檔案與源程式的檔案在同一個目錄下,其中data.txt的資料及其格式如下:

 2 程式

#include <iostream>
#include <fstream>
#include <Eigen/Dense>
#include <Eigen/Eigenvalues>

using namespace std;
using namespace Eigen;

int LEN=4;

int main()
{

    //MatrixXd m(LEN,LEN);
    MatrixXd mm(LEN,LEN);  //資料型別必須是整型
    
    //讀取txt資料。
//    m <<  1, 2, 3, 4,
//          5, 6, 7, 8,
//          9,10,11,12,
//         13,14,15,16;


    ifstream in("data.txt");  //讀取存有資料的txt檔案

    if(!in.is_open ())
            cout << "開啟失敗!" << endl;  //如果讀取失敗,則列印“開啟失敗!”
    
    while (!in.eof())  //若未到檔案結束一直迴圈,讀取文字資料到mm
        {
            for(int a=0;a<LEN;a++)
                for(int b=0;b<LEN;b++)
                {
                    in >> mm(a,b);
                }
        }
    

    cout << "讀取的資料是:" << endl;
    cout << mm.block(0,0,LEN,LEN) << endl << endl;  //打印出讀取的資料


    EigenSolver<Matrix4d> es(m);//計算資料,注意修改維度(下面的4)
    cout << "特徵值:" << endl << es.eigenvalues() << endl << endl;
    cout << "特徵向量:" << endl << es.eigenvectors() << endl << endl;


    ofstream outfile1;
    ofstream outfile2;
    string valuesFileName("values.txt"); //特徵值所在的txt檔案
    string vectorsFileName("vectors.txt"); //特徵向量所在的txt檔案

    outfile1.open(valuesFileName, ostream::app);  //以新增模式開啟檔案
    outfile2.open(vectorsFileName, ostream::app);  //以新增模式開啟檔案
    outfile1 << es.eigenvalues();
    outfile2 << es.eigenvectors();


    outfile1.close();  //關閉檔案
    outfile2.close();  //關閉檔案

    return 0;

}

3 解釋

註釋這麼清楚,不解釋!

4 結果

特徵值和特徵向量最後會輸出到values.txt和vecors.txt檔案中。