Чередование/Deinterleaving 3 вектора в C ++ STLC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Чередование/Deinterleaving 3 вектора в C ++ STL

Сообщение Anonymous »

Я пытаюсь объединить три сигнала сигналов в единую чередующуюся форму волны. Мне нужно знать, как лучше всего сделать это в C ++ STL . Лучшие решения будут использовать как можно больше стиля C ++ STL, избежать избыточного кода и т. Д. Есть ли какой -то класс типа STL «кортеж», который сделает это для меня? Мне всегда нужно смежное хранилище для обратной совместимости с другим кодом (следовательно, вектор). Лучшее решение было бы правильным и простым для понимания. Пространство и скорость не столь высоки приоритета, как Правильность и простота понимания . Я знаю, что все три входных сигнала имеют одинаковое количество образцов.

Код: Выделить всё

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(:);
< /code>
Это моя первая попытка C ++ STL: < /p>
typedef vector  dVector;
typedef vector::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;
}
< /code>
работает, но есть ли лучший способ сделать это?  Я надеялся, что может быть какой -то умный способ сделать это в одной линии с [b] transform () [/b].  Можете ли вы добавить B в A, затем C в A, затем преобразовать временный «A1A2A3 ...- B1B2B3 ...- C1C2C3 ...» вектор в «A1B1C1A2B2C2A3B3C3 ...»?  Решение Matlab довольно простое: < /p>
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  dVector;
typedef vector::iterator  dVectorIT;
void Deinterleave3(dVector outputWaveform, dVector &a, dVector &b, dVector &c)
{
ASSERT( !(outputWaveform.size()%3) );
a.clear(); b.clear(); c.clear();
dVectorIT oIT=outputWaveform.begin();
for(; oIT != outputWaveform.end(); )
{
a.push_back( *oIT++ );
b.push_back( *oIT++ );
c.push_back( *oIT++ );
}
}
Есть ли какая -то умная комбинация Transform () и back_inserter () , которая сделает обратную работу? Опять же, использование временного вектора будет приемлемым.). Фильтр HTML съел их! Кроме того, у меня есть новое представление о том, как исправить это с помощью пользовательского итератора.


Подробнее здесь: https://stackoverflow.com/questions/361 ... s-in-c-stl
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»