библиотека eigen в C++ выдает ошибку C2660: «Eigen::MatrixBase‹Derived›::eigenvalues»: функция не принимает 2 аргумента

#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>

Может ли кто-нибудь помочь мне решить эту проблему?


person user3137705    schedule 26.12.2013    source источник


Ответы (1)


Приведенный ниже код компилируется с g++ 4.7.3 под Ubuntu/Linaro с пакетом libeigen3-dev и запускается.

Проблемы в вашем коде:

  1. не приводить аргументы для собственных значений
  2. не диапазон индексов 1...размер, а 0...размер-1 (я исправил это, заменив Ham(i,j) на Ham(i-1,j-1)
  3. возвращаемый тип собственных значений - VectorXcf, а не VectorXf

#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");
}
person Tobias    schedule 26.12.2013
comment
Большое спасибо Тобиас. Код сейчас работает в Visual Studio. - person user3137705; 27.12.2013