2011-09-22 93 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