我正在尝试将三个信号波形组合成一个交错的波形.我需要知道在C++ STL中实现它的最佳方法.更好的解决方案将使用尽可能多的C++ STL样式,避免冗余代码等.是否有一些STL"元组"类型类可以为我做这个?我始终需要连续存储以便与其他代码向后兼容(因此,向量).最好的解决方案是正确且易于理解的.空间和速度并不像正确性和易于理解那样重要.
输出波形必须按如下顺序排序:来自第一个通道的第一个样本,来自第二个通道的第一个样本,来自第三个通道的第一个样本,然后继续来自每个通道的第二个样本,并对所有样本重复.我知道所有三个输入波形都具有相同数量的样本.
在Matlab中,我会这样做:
function outputWaveform=Interleave3(a, b, c) outputWaveform=zeros([1 3*length(a)]); outputWaveform(1:3:end)=a(:); outputWaveform(2:3:end)=b(:); outputWaveform(3:3:end)=c(:);
这是我的第一次C++ STL尝试:
typedef vector<double> dVector;
typedef vector<double>::iterator dVectorIT;
dVector Interleave3(dVector a, dVector b, dVector c)
{
dVector result(0, 3*a.size());
dVectorIT aIT=a.begin(), bIT=b.begin(), cIT=c.begin(), rIT=result.begin();
for(; aIT != a.end(); ++aIT, ++bIT, ++cIT)
{
*rIT++=*aIT;
*rIT++=*bIT;
*rIT++=*cIT;
}
return result;
}
它有效,但是有更好的方法吗?我希望有一些聪明的方法可以用transform()在一行中完成它.你可以将b附加到a,然后将c附加到a,然后将临时"a1a2a3 ...- b1b2b3 ...-c1c2c3 ..."向量转换为"a1b1c1a2b2c2a3b3c3 ..."?
额外问题:我还需要逆操作(将3*N个样本的输出波形分成3个N个样本的矢量).Matlab解决方案非常简单:
function [a, b, c]=Deinterleave3(outputWaveform) a=outputWaveform(1:3:end); b=outputWaveform(2:3:end); c=outputWaveform(3:3:end);
C++ STL似乎相当尴尬,我敢打赌,有一个更好的方法来做到这一点:
typedef vector<double …