首页 > 解决方案 > 将函数应用于犰狳矢量的部分

问题描述

我想在犰狳矩阵的一列的一部分上计算一些汇总函数(例如平均值)。关键是不要创建数据的临时副本。

这适用于整个列,使用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() 没有。

标签: c++armadillo

解决方案


推荐阅读