2012-12-17 67 views
2

我正在使用使用Eigen矩阵库的代码。我注意到所有通过该代码,有访问者如下:访问特征矩阵的行向量时复制或引用

RowVector3f V(size_t vertex_index) const 
{ 
    return mymatrix.row(vertex_index); 
} 

使用访问器返回一个const ref是不是更好? Eigen有可能吗?或者,也许只是返回指向内部的浮动指针开始并将其转换为向量(当然假设匹配行主布局)?

+0

如果你担心表现,那么不要。先尝试一下。有足够的人使用Eigen来确保它足够快。另外,你不知道向量是如何实现的。无论如何,它们可能只是浅拷贝或只是在内存中对ptr进行typedef。 – RedX

+0

这就是为什么我问。我不知道。足够的人使用它,所以我不必担心可能是真实的,但我仍然想要一个技术性的答案。 – Wilbert

回答

3

在Eigen中,mymatrix.row(vertex_index)返回一个Block(假设mymatrix是一个Matrix3f)。 Block对象本质上是指向原始数据的指针。在你的情况下,这个代理被复制到RowVector3f中。幸运的是,对于这样的小尺寸固定尺寸的对象,编译器会轻松优化这些额外的副本。所以我不打扰。

在更一般的情况下,我会重写V方法来返回一个MatrixXf :: RowXpr(这是一个适当的typedef块< ...>)。

-1

我不知道这个库,但我确实使用了这个技术,即返回对象,并且通过值返回它们,而不是通过引用。这是为了安全 - 当您按价值返回一部分数据时,您无法更改原始数据。

此外,使用对象而不是指向数据的指针使代码更友好,语法更高。

+1

你也不能改变'const&'。 – Pubby

相关问题