自己抽取向量
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
我认为这正是您想要的。
我有一个浮点数组 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
我认为这正是您想要的。