自己抽取向量

Decimate vector in eigen

我有一个浮点数组 Eigen::ArrayXf,我需要对其进行抽取(即从 f.i.8 个样本中选择 1 个)。

Eigen::ArrayXf decimatedSignal = Eigen::Map<Eigen::ArrayXf, 0, Eigen::InnerStride<8> >(signal.data(), length, 1).eval();

有效,但需要注意:我需要知道 length 有多长,它可能指定得太长,导致运行时错误。

问:有没有一种方法可以减少所有可能的长度,使得结果长度为 == signal.size() / 8?

两件事。您正在使用 c'tor 映射矩阵:

Map ( PointerArgType dataPtr, Index nbRows, Index nbCols, const StrideType & a_stride = StrideType() )

Constructor in the dynamic-size matrix case.

Parameters

dataPtr  pointer to the array to map
nbRows    the number of rows of the matrix expression
nbCols    the number of columns of the matrix expression
a_stride  optional Stride object, passing the strides. 

我想你想要向量的 c'tor:

Map ( PointerArgType dataPtr, Index a_size, const StrideType & a_stride = StrideType() )

Constructor in the dynamic-size vector case.

Parameters

dataPtr  pointer to the array to map
a_size    the size of the vector expression
a_stride  optional Stride object, passing the strides. 

第二件事就是你要length == signal.size())/8。那总是一个完整的整数,还是四舍五入?如果数据长度为16,而你想要位置[0][8],那么使用1+(signal.size()-1)/8作为长度参数:

Eigen::ArrayXf decimatedSignal = Eigen::Map<Eigen::ArrayXf, 0, Eigen::InnerStride<8> >(signal.data(), 1+((signal.size()-1)/8) ).eval();

例如:

#include <Eigen/Core>
#include <iostream>

using std::cout;
using std::endl;

int main(int argc, char *argv[])
{
    Eigen::VectorXf signal;
    signal.setLinSpaced(64, 0.0, 63.);
    cout << "Original signal:" << endl << signal.transpose() << endl;

    Eigen::ArrayXf decimatedSignal = Eigen::Map<Eigen::ArrayXf, 0, 
        Eigen::InnerStride<8> >(signal.data(), 1+((signal.size()-1)/8)).eval();

    cout << endl << "Decimated:" << endl << decimatedSignal.transpose() << endl;

    return 0;
}

产出

Original signal: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

Decimated: 0 8 16 24 32 40 48 56

我认为这正是您想要的。