返回对Armadillo向量元素的引用

时间:2014-12-30 10:15:41

标签: c++ armadillo

我很难确定如何返回对犰狳矢量元素的引用。

e.g。

arma::vec3 v = arma::zeros(3);
v.at(0) = 1; // works as expected, surely this means the at() method returns a reference?

然而这不会编译:

struct Custom {
  arma::vec3 v;
  double& x() { return v.at(0) }
}
Custom custom;
custom.x() = 1;

错误如下:

  

错误:从'const double'类型的表达式初始化'double&'类型的引用无效

我认为这是因为at()返回一个副本而不是一个引用,但是之前的例子是如何工作的?

我相信这可能是因为犰狳的胶水类型被退回而不是真正的双重胶水,但我找不到任何关于这些胶水的文件,所以我可以这样做。我不确定如何使用它们。


答案

以下方法有效,提供类似参考的方法。对矢量元素的命名访问。

inline double x() const { return at(0); }
inline double& x() { return at(0); }

inline double y() const { return at(1); }
inline double& y() { return at(1); }

inline double z() const { return at(2); }
inline double& z() { return at(2); }

inline const arma::subview_col<double> xy() const { return rows(0,1); }
inline arma::subview_col<double> xy() { return rows(0,1); }

1 个答案:

答案 0 :(得分:1)

at(0)几乎肯定会返回一个代理对象,可以将其转换为double,或者分配一个double,但实际上并不是参考。这可能是为了避免悬空引用,或者允许有效存储稀疏矩阵。遗憾的是,Armadillo的documentation在语义上非常安静,但没有指定at返回引用。

这表示不鼓励您返回引用。还有另一种方法可以达到你想要的效果吗?