2011-09-22 80 views
5

如何初始化特徵中的SparseVector?以下代碼:如何初始化特徵中的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

從來沒有聽說過Eigen,但粗略看一下我注意到'coeffRef'的文檔,你試過'vec.coeffRef(0)= 1.0'嗎? – HostileFork

+0

非常感謝。這實際上是在SparseVector中插入的方式。 – Tarek

+0

好吧,我會這樣回答... – HostileFork

回答

4

望着文檔我注意到Scalar& coeffRef(Index i),和它說:

返回位於指定索引我一個參考系數值。此操作調用日誌(rho * size)二進制搜索。如果該係數還不存在,則執行對順序緩衝器的排序插入。 (如果非零上面,我的號碼是大型此插入可能是非常昂貴的。)

所以下面應該工作:

#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

是的,但這只是不正確的語法。您通常不會分配函數調用的返回值。 – bobobobo

+0

我同意bobobobo,目前的界面只是混淆。我發現這個網站,因爲明顯的語法不起作用。這是一個標誌,界面有點遲鈍(更不用說冗長)。 – Joe