我想在犰狳矩阵的某列的一部分上计算一些汇总函数(例如均值)。关键不是创建数据的临时副本。
这适用于使用unsafe_col
的整个列:
arma::mat x;
double d = mean(x.unsafe_col(0));
要获取矢量的一部分,我可以使用:
x.col(0).subvec(0,100);
但是,这会创建矢量数据的副本,我想避免这种情况。
将犰狳提供的函数应用于列向量的部分的最有效方法是什么?在此应用程序中,性能绝对至关重要。
我发现的一种方法是使用armadillo文档中的“ advanced constructor”构造带有指向底层内存的指针的向量,但首先要使列起始处的指针加倍并添加偏移量仅仅为了创建一个较短的向量而开始和结束似乎是一个hack ...
更新:以下是行为示例:
#include <armadillo>
#include <iostream>
arma::mat m( {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}});
const arma::vec view1() {
return m.unsafe_col(0).subvec(0,2);
}
const arma::vec view2() {
double *start = &m[0,0];
const int n = 3;
return arma::vec(start, 3, false, false);
}
int main() {
std::cout << &m(0,0) << " " << &m(1,0) << " " << &m(0,1) << std::endl;
auto v1(view1());
auto v2(view2());
std::cout << &v1(0) << std::endl;
std::cout << &v2(0) << std::endl;
return 0;
}
返回,例如:
0x56419b070170 0x56419b070178 0x56419b070190
0x7ffcb36f7510
0x56419b070170
因此view1()创建了一个副本,而view2()没有。