[英]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.