Matlab dwt в указанном измерении

#matlab #dwt

#matlab #dwt

Вопрос:

У меня есть значение размера набора 65536 x 192 данных в Matlab. Если я хочу использовать одномерный БПФ по второму измерению, я мог бы либо выполнить цикл for:

 %pre-allocate ect..
for i=1:65536
   F(i,:) = fft(Sig(i,:));
end
  

или я мог бы указать измерение и сделать это без цикла for:

 F = fft(Sig,[],2);
  

что примерно в 20 раз быстрее для моего набора данных.

Я искал что-то подобное для дискретного вейвлет-преобразования (dwt), но не смог его найти. Итак, мне было интересно, знает ли кто-нибудь способ сделать dwt по указанному измерению в Matlab? Или я должен использовать циклы for?

Комментарии:

1. Моей первой попыткой было просто транспонировать, но, похоже dwt , он всегда возвращает 1D результат для 2D ввода??

Ответ №1:

В вашем примере с циклическим БПФ кажется, что вы работаете со строками. В Matlab используется порядок следования столбцов. Это может объяснить разницу в производительности. Остается ли производительность такой же, если вы работаете со столбцами? Если это правильное объяснение, вы могли бы использовать dwt в цикле.

Комментарии:

1. Работа со столбцами позволила мне ускорить работу в 6 раз, но цикл for по-прежнему (что неудивительно) намного медленнее, чем прямой код. Таким образом, dwt по указанным измерениям все равно будет предпочтительнее. Спасибо за подсказку о главном порядке столбцов в Matlab, хотя я этого не знал!

2. Вы также изменили результат, который будет сохранен в столбце?

3. См. mathworks.co.uk/company/newsletters/news_notes/june07 /… для получения дополнительной информации о доступе к памяти MATLAB

4. Да. Цикл for теперь занимает около 1,4 секунды, в то время как прямой метод занимает около 0,2 для бпф . Проблема в том, что dwt намного медленнее, чем fft ..

Ответ №2:

Решение, если вам действительно нужна производительность, — это сделать свой собственный MEX, вызывающий библиотеку дискретных вейвлет-преобразований C так, как вы хотите.

Комментарии:

1. Да, я так думаю. Если у меня будет время / энергия для этого, я помещу код в файлообменник.

2. Это было бы здорово! Вероятно, вы не единственный, кому это нужно.

Ответ №3:

Я предполагаю, что вы используете функцию из набора инструментов Wavelet: http://www.mathworks.co.uk/help/toolbox/wavelet/ref/dwt.html

В документации, похоже, не описывается действие с массивом, поэтому оно, вероятно, не поддерживается. Если он позволяет вам вводить массив, то он будет работать с первым не одноэлементным измерением или будет игнорировать форму и обрабатывать ее как вектор.

Комментарии:

1. Я предполагаю, что это правильный ответ, поэтому я приму его, но он был не очень полезен / полезен, поэтому вы не получите upvote: p (Только еще несколько принятых ответов с 0 голосами, и вы получите золотой значок! ;))

2. 🙂 Извините. Жаль, что у меня не было чего-то лучшего, чтобы сказать. Я полагаю, что набор инструментов Wavelet ожидает, что вы будете использовать только dwt с одномерными данными и dwt2 с двумерными данными. У меня была точно такая же проблема с gpuArray версией fft in R2010b, хотя у меня не было возможности попробовать еще раз.