2011-09-22 4 views
5

EigenのSparseVectorを初期化するにはどうすればよいですか?次のコード: EigenのSparseVectorを初期化する方法

#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET 
#include <Eigen/Sparse> 
using namespace Eigen; 
SparseVector<float> vec(3); 
main() 
{ 
    vec(0)=1.0; 
} 

が途中で私に次のエラー

error: call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type vec(0)=1.0;

を与えるには、VEC [0] = 1.0のいずれかに動作しません。ドキュメントを見ると

+2

私は 'coeffRef'に気づいたドキュメントでは、Eigenを知りませんでした。しかし、vec.coeffRef(0)= 1.0'も試しましたか? – HostileFork

+0

ありがとうございました。これはまさにSparseVectorへの挿入方法です。 – Tarek

+0

よろしくお願いします。 – HostileFork

答えて

4

私はScalar& coeffRef(Index i)に気づいた、そしてそれは言う:

は、指定されたインデックスiにおける係数値への参照を返します。この操作は、ログ(ρ*サイズ)バイナリ検索を含む。係数がまだ存在しない場合、順次バッファへのソートされた挿入が実行される。 (I上記非ゼロの数が多い場合には、この挿入は非常にコストがかかるかもしれません。)

だから、次は動作するはずです:彼らはそれを代わりに配列のオーバーロードを使用しての道をやった理由

#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET 
#include <Eigen/Sparse> 
using namespace Eigen; 
SparseVector<float> vec(3); 
main() 
{ 
    vec.coeffRef(0)=1.0; 
} 

わかりません。おそらく、IS_STABLEになると、より典型的なC++の方法でそれを行うでしょうか?

+2

私は、ユーザーに潜在的にコストのかかる操作を知らせたいと思っています。 – eudoxos

+1

これは正しくない構文です。一般的に、関数呼び出しの戻り値に_assign_を指定することはありません。 – bobobobo

+0

私は現在のインターフェイスがちょうど混乱しているとboboboboに同意します。明らかな構文がうまくいかなかったので、このウェブサイトを見つけました。これは、インターフェイスが少し鈍い(冗長ではありません)という兆候です。 – Joe

関連する問題