#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, хотя у меня не было возможности попробовать еще раз.