2017-08-10 9 views
1

私はEigen Solverを使用しています。作成したベクトル/行列から値を取得するのに問題があります。たとえば、次のコードでは、エラーはありませんが、実行時エラーが発生します。私は(これは私が書いた別の関数内のパラメータになりますように私はこれを必要とする)私の選択の変数にxの値を取得するにはどうすればよい固有値ソルバのVectorから値を取得する

#include <iostream> 
#include <math.h> 
#include <vector> 
#include <Eigen\Dense> 
using namespace std; 
using namespace Eigen; 

int main() 
{ 
    Matrix3f A; 
    Vector3f b; 
    vector<float> c; 
    A << 1, 2, 3, 4, 5, 6, 7, 8, 10; 
    b << 3, 3, 4; 
    cout << "Here is the matrix A:\n" << A << endl; 
    cout << "Here is the vector b:\n" << b << endl; 
    Vector3f x = A.colPivHouseholderQr().solve(b); 
    for (int i = 0; i < 3; i++) 
    { 
     c[i] = x[i]; 
     cout << c[i] << " "; 
    } 

    //cout << "The solution is:\n" << x << endl; 
    return 0; 
} 

+2

'が、実行時ERROR'が、それはあり得ます何か秘密?あなたはそれを共有できますか? – Gluttton

+1

問題は、 'std :: vector c'がサイズ3にサイズ変更されていないことです(Eigenの問題ではなく、ランタイムエラーのソースから見るべきです)。 – chtz

+0

' c.resize(b。 size()); ' – RHertel

答えて

2

使用

vector<float> c(3); 

それとも

for (int i = 0; i < 3; i++) 
{ 
    c.push_back(x[i]); 
    cout << c[i] << " "; 
} 
3

のコメントで述べたように、問題はcが、それに値を代入する前にリサイズされなかったということでした。また、あなたが実際にEigen::Vector3f x必要はありませんが、vectorのデータを指すMapに直接.solve()操作の結果を割り当てることができます。

#include <iostream> 
#include <vector> 
#include <Eigen/QR> 
using namespace Eigen; 
using namespace std; 

int main() 
{ 
    Matrix3f A; 
    Vector3f b; 
    vector<float> c(A.cols()); 
    A << 1, 2, 3, 4, 5, 6, 7, 8, 10; 
    b << 3, 3, 4; 
    cout << "Here is the matrix A:\n" << A << endl; 
    cout << "Here is the vector b:\n" << b << endl; 
    Vector3f::Map(c.data()) = A.colPivHouseholderQr().solve(b); 

    for(int i=0; i<3; ++i) std::cout << "c[" << i << "]=" << c[i] << '\n'; 
} 
関連する問題