[英]Access column of matrix without creating copy of data, using Armadillo library
我有一个(数据/存储)类与成员arma::mat
(一个矩阵),我想只访问这个矩阵的一列( arma::colvec
),但我不想创建一个副本列中的数据。 有没有办法实现这个目标?
我的第一次尝试是使用.col(i)
,但这会返回一个临时的,所以引用它不起作用。
使用.colptr(i)
不会创建副本,但它也返回一个double*
而不是vec
,所以它让我的生活变得有点困难。
struct Data
{
mat A;
/* constructors etc. */
// reference to temporary (this is bad)
const vec& getColumn(const uint i) { return A.col(i); }
// doesn't create a copy, but doesn't return a vec either
const double* getColumn2(const uint i) const { return A.colptr(i); }
}
想要这个的原因是类有向量和矩阵,我想制作统一的getter和setter方法,它们可以访问其中一个向量,也可以访问矩阵中的一列,具体取决于索引(用于迭代目的)。
一个例子:
struct Data
{
mat A;
vec b;
// getter
const vec& operator()(const uint i) const
{
if (i == 0)
{
return b;
}
else if (i == 1)
{
// return first column of A
}
// etc.
}
// setter
vec& operator()(const uint i)
{
// similar to above
}
}
根据zauguin的回答,我找到了以下方法来实现所需的功能:
struct Data
{
mat A;
vec b;
// getter
subview_col<mat::elem_type> operator()(const uint i)
{
if (i == 0)
{
return b.col(0);
}
else if (i > 0 && i < (1 + A.n_cols()))
{
return A.col(i - 1);
}
else
{
// should probably do some error checking here
}
}
// setter
vec& operator()(const uint i)
{
// same as the above, but without consts in declaration
}
}
这会返回subview_col<mat::elem_type>
而不是vec
,但功能与我的目的相似/相同。 我不确定使用.col(0)
对vec
的性能影响,但我并不担心。
在arma中,A.col(i)不返回引用,而是临时引用。 您可以返回此临时值以获取引用语义。 使用C ++ 14,只需编写
auto getColumn(const uint i) { return A.col(i); }
否则,您必须返回代理类型,它是
subview_col<mat::elem_type> getColumn(const uint i) { return A.col(i); }
如果你必须返回vec
而不是subview_col<...>
,你可以使用A.unsafe_col(i)
,但你必须确保,在A
的生命周期结束后你不会尝试使用它。 。 看这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.