2017-01-26 12 views
-1

私はEIGENを使ってforループ内の値でベクトルを埋めなければなりません。EIGENライブラリを使って動的ベクトルを塗りつぶす

dynamic: /usr/include/Eigen/src/Core/DenseCoeffsBase.h:425: Eigen::DenseCoeffsBase::Scalar& Eigen::DenseCoeffsBase::operator()(Eigen::Index) [with Derived = Eigen::Matrix; Eigen::DenseCoeffsBase::Scalar = double; Eigen::Index = int]: Assertion `index >= 0 && index < size()' failed. Abgebrochen

私は簡単にはstdを使用していることを実現することができることを知っている:私はそれをコンパイルすることができますが、私はプログラムを実行すると、私はこのエラーを取得するそのような何か...

#include <iostream> 
#include <Eigen/Dense> 
using namespace std; 
using namespace Eigen; 

int main(){ 
    VectorXd s; 
    for (int i=0,i<10;i++){ 
    s(i) = (double) i; 
    } 
return 0; 
} 

をしようとしてイム: :ベクトルクラスですが、それ以降はたくさんの行列演算を行う必要があるため、固有値を使ってやりたいと思います。

ありがとうございました!

EDIT:私のアプリケーションでは、コンパイル時にベクトルのサイズがわかりません。固有値にvector::push_backのような類似のメソッドがあるかどうかを調べたいと思います。

+0

*アサーション 'index> = 0 && index LogicStuff

答えて

0

を試してみてください。 resize関数の問題を次のように解決できます。

#include <iostream> 
#include <Eigen/Dense> 
using namespace std; 
using namespace Eigen; 

int main(){ 
    VectorXd s; 
    for (int i=0,i<10;i++){ 
    s.resize(i+1); 
    s(i) = (double) i; 
    } 
return 0; 
} 

@Jonasは私がループする前に、ベクトルの大きさを知っているので、私はループの前に一度サイズを変更できることを実感しました。固有のドキュメントでリサイズ機能について

を見つけることができます。

ので

"The resize() method is a no-operation if the actual matrix size doesn't change; otherwise it is destructive: the values of the coefficients may change. If you want a conservative variant of resize() which does not change the coefficients, use conservativeResize() "

、文句を言わない失われた値を保証するためにconservativeResizeを()を使用するより良いかもしれないとき。

+0

'resize'関数が古い値を保持するかどうかはわかりません。実行時にどれくらい必要となるかを伝える方法がありませんか? – Maikel

+0

ベクトルのサイズに関する情報はいつありますか?あなたはループでサイズを変更する必要がありますか、それとも前に行うことができますか?ループでサイズを変更すると、通常は効率が悪くなります。 –

+0

私はループの前のベクトルのサイズを知っています、それは大きなポイントです。ありがとうございました! –

2

ベクターのスペースを予約していません。これはstd::vectorでも同じです。 @Maikelが私に助言したよう

この

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

int main() 
{ 
    // resize to 10 elements 
    auto vec = Eigen::VectorXd(10); 
    for (int i = 0; i < vec.size(); ++i) { 
    vec[i] = i; 
    } 
    std::cout << vec << '\n'; 
} 
+0

それは問題です、私はコンパイル時にベクトルのサイズを知っていません。 std :: vectorを使用すると、push_backメソッドでそれを行うことができます。固有値で同じことを達成する方法はありますか?ありがとう! –

+0

'resize'関数を使うことができます。 https://eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html – Maikel

+0

を参照してください。サイズ変更機能で動作します。ありがとう! –

関連する問題