我有一个数组float64 arr [60]用于存储来自DAQ的电压值。数组填充如下:
10 SAMPLES_PER_CHANNEL, 6 CHANNELS, grouped by channel
transducer_0 transducer_1 ... transducer_6
[0, 1 ..., 9, 10, 11 ..., 19 ... 50, 51 ..., 59]
我想将这些数据存储到一维指针数组中并传递给定义为bool func2(int samples, double* const* arr2)
我在this post中提出了类似的问题,@ Yakk给出的解决方案是:
template<size_t stride, class T, size_t N, size_t count = N/stride>
std::array<T*, count> make_2d( T(&raw)[N] ) {
std::array<T*, count> retval;
for (size_t i = 0; i < count; ++i)
retval[i] = raw + i*stride;
return retval;
}
我正在寻找帮助来为double* const* arr2
生成参数func2()
,这是存储在通道中的值的相反顺序。 E.g。
[channel 0] [channel 1] [channel 5]
{val 9, val 8 ...val 0}, {val 19, val 18 ...val 10}, ...
输入可以是初始的1D数组,也可以是通过模板make_2d()
函数构造的1D指针数组。我想知道最有效的方法是什么,因为阵列正在以5000Hz的速率更新。我希望有一种方法可以让我不必从输入数组复制值,尽管我对时间效率和空间效率更感兴趣。
目前我正在创建第二个指针数组并复制反向通道值。
// DOF == 6, SAMPLES_PER_CHANNEL = 10
double ch0[SAMPLES_PER_CHANNEL];
double ch1[SAMPLES_PER_CHANNEL];
double ch2[SAMPLES_PER_CHANNEL];
double ch3[SAMPLES_PER_CHANNEL];
double ch4[SAMPLES_PER_CHANNEL];
double ch5[SAMPLES_PER_CHANNEL];
double* data_rev[DOF] = {
ch0, ch1, ch2, ch3, ch4, ch5};
// generate reversed order array
for (int i = DOF - 1; i > 0; --i) {
for (int j = SAMPLES_PER_CHANNEL - 1; j > 0; --j) {
data_rev[DOF - 1 - i][SAMPLES_PER_CHANNEL - 1 - j] = static_cast<double>(data[(i*10)+j]);
}
}
答案 0 :(得分:1)
如果我理解正确,你想要的是不可能的: 你不能将一个指针数组传递给func2,使得它看起来好像样本的顺序是相反的(我假设你不能修改func2),但是只要你没有在一个非常低功率的机器上工作,这样的东西很便宜(无论是时间还是空间):
double arr[60];
std::array<double,60> tmp;
int main() {
auto t = make_2d<10>(tmp);
std::reverse(t.begin(), t.end());
while (true) {
readData(arr, 60);
reverse_copy(begin(arr),end(arr), begin(tmp));
func2(60, t.data());
}
}