ошибка: не найдена соответствующая функция для вызова метода 'coeugate_gradient' в Eigen Library - PullRequest
0 голосов
/ 25 апреля 2018

Я получаю следующую ошибку при компиляции кода на языке c ++, имеющего библиотеку Eigen

ошибка: не найдена соответствующая функция для вызова 'conugate_gradient' в библиотеке Eigen

Воткод ниже:

SparseMatrix<double> A(truncatedSize,truncatedSize);
for(int i=0;i<truncatedSize;i++)
{
    for(int j=0;j<truncatedSize;j++)
    {
        A.insert(i,j)=TruncatedGlMatrix[i][j];
    }
}

VectorXf V(truncatedSize);
for(int i=0;i<truncatedSize;i++)
{       
    V(i)=TruncatedForce[i][1];
}

// solve Ax = b
ConjugateGradient<SparseMatrix<double>, Lower|Upper> cg;
cg.compute(A);

VectorXf xa(truncatedSize);
xa = cg.solve(V);

1 Ответ

0 голосов
/ 26 апреля 2018

Вам действительно нужно показать это как MCVE .Если бы вы смоделировали это немного больше, ваш результат мог бы быть следующим:

#include <Eigen/Core>
#include <Eigen/Sparse>

using namespace Eigen;

int main()
{
    int truncatedSize = 50;
    SparseMatrix<double> A(truncatedSize, truncatedSize);

//  We have no idea what TruncatedGlMatrix or TruncatedForce are...
//  for (int i = 0; i < truncatedSize; i++)
//  {
//      for (int j = 0; j < truncatedSize; j++)
//      {
//          A.insert(i, j) = TruncatedGlMatrix[i][j];
//      }
//  }

    VectorXf V(truncatedSize);
//  for (int i = 0; i < truncatedSize; i++)
//  {
//      V(i) = TruncatedForce[i][1];
//  }

    // solve Ax = b
    ConjugateGradient<SparseMatrix<double>, Lower | Upper> cg;
    cg.compute(A);

    VectorXf xa(truncatedSize);
    xa = cg.solve(V);
    return 0;
}

Я получаю от вас другую ошибку, но это может быть потому, что мне пришлось добавить некоторые догадки относительно того, что вына самом деле смотрите.В приведенном выше коде проблема заключается в том, что вы смешиваете скалярные типы double и float.А именно,

xa = cg.solve(V);

xa и V являются векторами float с, в то время как cg и A имеют double в качестве скалярного типа.Вы должны явно привести между ними, так что замена этой строки на

xa = cg.solve(V.cast<double>()).cast<float>();

решит проблему, с которой сталкивается мой MCVE (которая также может быть вашей проблемой, я не знаю достаточно, чтобы сказать).

...