C ++中的特征库给出错误C2660:'Eigen :: MatrixBase <derived> :: eigenvalues':函数不带2个参数</derived>

时间:2013-12-26 21:17:36

标签: c++ eigen eigenvalue

#include <iostream>
#include <math.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <dense>
#include <Eigenvalues> 

using namespace Eigen;
using namespace std;

void main()
{
    int i, j;
    float S = 2.5, g = 1, B = 1, H = 1, D = 1, E = 1, G, Sz1, Sz2, Sz3, Sz4, Kp, Kpp, Km, Kmm, E1, E2;

    Sz1 = -S;
    Sz2 = -S;
    G = g * B * H;
    G = 1;

    MatrixXf Ham(6, 6);

    for (i = 1; i <= 2 * S + 1; i++)
    {
        Sz2 = -S;
        for (j = 1; j <= 2 * S + 1; j++)
        {
            E1 = 0;
            Kp = 0;
            E2 = 0;
            Kpp = 0;
            Km = 0;
            Kmm = 0;

            Sz3 = Sz2;
            Sz4 = Sz2;

            if (i == j)
            {
                Ham(i, j) = (G * Sz2) + D * (Sz2 * Sz2 - (1 / 3) * S * (S + 1));
            }
            else
            {
                Kp = sqrt(S * (S + 1) - Sz3 * (Sz3 + 1));
                Sz3 = Sz3 + 1;
                Kpp = sqrt(S * (S + 1) - Sz3 * (Sz3 + 1));
                Sz3 = Sz3 + 1;

                if (Sz3 == Sz1)
                {
                    E1 = Kp * Kpp;
                }
                else
                {
                    E1 = 0;
                }

                Km = sqrt(S * (S + 1) - Sz4 * (Sz4 - 1));
                Sz4 = Sz4 - 1;
                Kmm = sqrt(S * (S + 1) - Sz4 * (Sz4 - 1));
                Sz4 = Sz4 - 1;

                if (Sz4 == Sz1)
                {
                    E2 = Km * Kmm;
                }
                else
                {
                    E2 = 0;
                }
                Ham(i, j) = (E1 + E2) / 2;
            }
            Sz2 = Sz2 + 1;
        }
        Sz1 = Sz1 + 1;
    }

    VectorXf eivals = Ham.eigenvalues(6, 6);
    cout << "The eigenvalues of the Hamiltonian matrix are:" << endl << eivals << endl;

    system("pause");
}

当我想编译这段代码时,我收到一个错误:

  

错误C2660:'Eigen::MatrixBase<Derived>::eigenvalues':函数不带2个参数

Derived = Eigen::Matrix<float, -1, -1>

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

下面的代码在Ubuntu / Linaro下用g ++ 4.7.3编译,包含libeigen3-dev并运行。

代码中的问题:

  1. 不给出特征值的论据
  2. 不是索引范围1 ...大小但是0 ... size-1(我通过Ham(i,j)替换Ham(i-1,j-1)来纠正这个问题
  3. 特征值的返回类型是VectorXcf而不是VectorXf

  4. #include <iostream>
    #include <math.h>
    // #include <conio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <eigen3/Eigen/Dense>
    #include <eigen3/Eigen/Eigenvalues> 
    
    using namespace Eigen;
    using namespace std;
    
    int main()
    {
        int i, j;
        float S = 2.5, g = 1, B = 1, H = 1, D = 1, E = 1, G, Sz1, Sz2, Sz3, Sz4, Kp, Kpp, Km, Kmm, E1, E2;
    
        Sz1 = -S;
        Sz2 = -S;
        G = g * B * H;
        G = 1;
    
        MatrixXf Ham(6, 6);
    
        for (i = 1; i <= 2 * S + 1; i++)
        {
            Sz2 = -S;
            for (j = 1; j <= 2 * S + 1; j++)
            {
                E1 = 0;
                Kp = 0;
                E2 = 0;
                Kpp = 0;
                Km = 0;
                Kmm = 0;
    
                Sz3 = Sz2;
                Sz4 = Sz2;
    
                if (i == j)
                {
                    Ham(i-1, j-1) = (G * Sz2) + D * (Sz2 * Sz2 - (1 / 3) * S * (S + 1));
                }
                else
                {
                    Kp = sqrt(S * (S + 1) - Sz3 * (Sz3 + 1));
                    Sz3 = Sz3 + 1;
                    Kpp = sqrt(S * (S + 1) - Sz3 * (Sz3 + 1));
                    Sz3 = Sz3 + 1;
    
                    if (Sz3 == Sz1)
                    {
                        E1 = Kp * Kpp;
                    }
                    else
                    {
                        E1 = 0;
                    }
    
                    Km = sqrt(S * (S + 1) - Sz4 * (Sz4 - 1));
                    Sz4 = Sz4 - 1;
                    Kmm = sqrt(S * (S + 1) - Sz4 * (Sz4 - 1));
                    Sz4 = Sz4 - 1;
    
                    if (Sz4 == Sz1)
                    {
                        E2 = Km * Kmm;
                    }
                    else
                    {
                        E2 = 0;
                    }
                    Ham(i-1, j-1) = (E1 + E2) / 2;
                }
                Sz2 = Sz2 + 1;
            }
            Sz1 = Sz1 + 1;
        }
    
        VectorXcf eivals = Ham.eigenvalues();
    
        cout << "The eigenvalues of the Hamiltonian matrix are:" << endl << eivals << endl;
    
    
    
        system("pause");
    }