【发布时间】:2010-08-31 15:16:26
【问题描述】:
我正在尝试将三个信号波形组合成一个交错的波形。我需要知道在 C++ STL 中做到这一点的最佳方法。更好的解决方案会尽可能多地使用 C++ STL 风格,避免冗余代码等。是否有一些 STL“元组”类型的类可以为我做这件事?我始终需要连续存储以向后兼容其他代码(因此,向量)。最好的解决方案是正确且易于理解的。空间和速度不如正确性和易于理解那么重要。
输出波形的顺序必须如下:第一个通道的第一个样本,第二个通道的第一个样本,第三个通道的第一个样本,然后继续每个通道的第二个样本,并重复所有样本。我知道所有三个输入波形都有相同数量的样本。
在 Matlab 中,我会这样做:
函数 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它有效,但有更好的方法吗?我希望可能有一些聪明的方法可以用 transform() 在一行中做到这一点。你能把b附加到a,然后将c附加到a,然后将临时的“a1a2a3...-b1b2b3...-c1c2c3...”向量转换为“a1b1c1a2b2c2a3b3c3...”吗?
额外问题:我还需要逆运算(将 3*N 个样本的输出波形拆分为 3 个向量,每个向量包含 N 个样本)。 Matlab 解决方案非常简单:
函数 [a, b, c]=Deinterleave3(outputWaveform) a=输出波形(1:3:结束); b=输出波形(2:3:结束); c=输出波形(3:3:结束);C++ STL 看起来相当尴尬,我敢打赌还有比这更好的方法:
typedef vectortransform() 和 back_inserter() 是否有一些巧妙的组合可以进行逆运算?同样,使用临时向量也是可以接受的。
Boost 有一个“zip iterator”,但我不知道它是否会执行交错或去交错操作。
编辑:修复丢失的尖括号 ()。 HTML 过滤器吃掉了它们!此外,我对如何使用自定义迭代器解决此问题有了新的想法。
【问题讨论】:
-
我不能定义一个增加 3 而不是 1 的自定义迭代器吗?我尝试但未能创建一个带有私有成员变量的通用迭代器,用于跳过(3)值的数量和值的总数。当它到达尽头时,它会环绕。例如,51 个元素将按以下顺序引用元素 [0]、[3]、[6]...[48]、[1]、[4]、...
-
zip 迭代器将“虚拟地”进行交错 - 即您可以像交错一样使用向量,因此您甚至不需要去交错。
标签: c++ stl signal-processing