2011-09-22 9 views
5

¿Cómo puedo inicializar un SparseVector en Eigen? El siguiente código:¿Cómo puedo inicializar un SparseVector en Eigen

#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; 
} 

me da el siguiente error

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

por cierto, vec [0] = 1,0 no funciona tampoco.

+2

Nunca he oído hablar de Eigen, pero eché un vistazo rápido a la documentación que noté 'coeffRef', ¿has intentado' vec.coeffRef (0) = 1.0' también? – HostileFork

+0

Muchas gracias. Esta es de hecho la forma de inserción en SparseVector. – Tarek

+0

Está bien, lo responderé así entonces ... – HostileFork

Respuesta

4

En cuanto a la documentación me di Scalar& coeffRef(Index i), y dice:

Devuelve una referencia al valor del coeficiente en el índice i dada. Esta operación invoca una búsqueda binaria de registro (rho * size). Si el coeficiente no existe todavía, se realiza una inserción ordenada en un buffer secuencial. (Esta inserción puede ser muy costoso si el número de nonzeros por encima de i es grande.)

Así que lo siguiente debe funcionar:

#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; 
} 

No sé por qué lo hicieron de esa manera en lugar de utilizar matriz sobrecarga. Quizás cuando se convierta en IS_STABLE, lo harán de una manera C++ más típica.

+2

Creo que querían que los usuarios estuvieran al tanto de una operación potencialmente costosa. – eudoxos

+1

Sí, pero esta es solo la sintaxis incorrecta. En general, no se asigna _ al valor de retorno de una llamada a función. – bobobobo

+0

Estoy de acuerdo con bobobobo que la interfaz actual es simplemente confusa. Encontré este sitio web porque la sintaxis obvia no funcionaba. Esa es una señal de que la interfaz es un poco obtusa (por no mencionar prolija). – Joe

Cuestiones relacionadas