c++ - 将函数应用于犰狳矢量的部分
问题描述
我想在犰狳矩阵的一列的一部分上计算一些汇总函数(例如平均值)。关键是不要创建数据的临时副本。
这适用于整个列,使用unsafe_col
:
arma::mat x;
double d = mean(x.unsafe_col(0));
要获得向量的一部分,我可以使用:
x.col(0).subvec(0,100);
但是,这会创建矢量数据的副本,这是我想避免的。
将犰狳提供的函数应用于列向量部分的最有效方法是什么?在此应用程序中,性能绝对是至关重要的。
我发现的一种方法是使用指向底层内存的指针构造一个向量,使用犰狳文档中所谓的“高级构造函数”,但首先获取指向 double 的指针以用于列开始,并为开始和结束添加偏移量只是为了创建一个更短的向量似乎是一个 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() 没有。
解决方案
推荐阅读
- javascript - React TS 中的搜索栏未按预期工作
- git - 合并除一个之外的所有提交的最佳方法
- javascript - 400 错误请求:Node.js Express Ajax
- csrf - Sugarcrm 8 XSRF
- phpstorm - 去除 PhpStorm 中的黑条效果
- jenkins - 无限数组作为 Jenkins 参数
- asp.net-core - Identityserver4 中的 IntrospectionClient 函数总是返回 Unauthorized
- python - 将 Pandas 作为变量传递会改变它
- node.js - 如何使用 Crypto 加密和解密 Nodejs 中的二进制数据
- arrays - Excel:创建一个具有n倍常数的数组