2011-10-12 1 views
1

J'ai un jeu de données Sig de taille 65536 x 192 dans Matlab. Si je veux prendre une dimension fft le long de la deuxième dimension, je pouvais soit faire une boucle:Matlab dwt across dimension spécifiée

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

ou je pourrais préciser la dimension et de le faire sans la boucle:

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

qui est environ 20 fois plus rapide pour mon ensemble de données.

J'ai cherché quelque chose de similaire pour la transformée en ondelettes discrètes (dwt), mais je n'ai pas réussi à la trouver. Donc je me demandais si quelqu'un sait un moyen de faire dwt à travers une dimension spécifiée dans Matlab? Ou dois-je utiliser pour les boucles?

+0

Mon premier essai était de simplement transposer, mais il semble que 'dwt' renvoie toujours un résultat 1D pour l'entrée 2D ?? –

Répondre

0

Je suppose que vous utilisez la fonction de la boîte à outils Wavelet: http://www.mathworks.co.uk/help/toolbox/wavelet/ref/dwt.html

La documentation ne semble pas décrire agissant sur un tableau, il est donc probablement pas pris en charge. Si cela vous permet d'entrer un tableau, alors il fonctionnera sur la première dimension non-singleton ou il ignorera la forme et la traitera comme un vecteur.

+0

Je suppose que c'est la bonne réponse, donc je vais l'accepter, mais ce n'était pas très utile/utile, donc vous ne recevez pas un upvote: p (Seulement un ou deux de plus de 0 réponses acceptées et vous obtenez un badge d'or!)) – Ghaul

+0

:) Désolé. J'aimerais avoir quelque chose de mieux à dire. Je suppose que la boîte à outils Wavelet s'attend à ce que vous utilisiez seulement 'dwt' avec les données 1D et' dwt2' avec les données 2D. J'ai eu exactement le même problème avec la version 'gpuArray' de' fft' dans R2010b, bien que je n'ai pas eu l'occasion d'essayer à nouveau. – Nzbuu

2

Dans votre exemple FFT en boucle, il semblerait que vous opériez sur des lignes. Matlab utilise un Column-major order. Cela peut expliquer la différence de performance. La performance est-elle la même si vous opérez sur des colonnes? Si c'est la bonne explication, vous pouvez utiliser dwt dans une boucle.

+0

L'opération sur les colonnes m'a donné une accélération de 6x, mais la boucle * for * est toujours (sans surprise) beaucoup plus lente que le code direct. Donc, un * dwt * à travers les dimensions spécifiées serait toujours préférable. Merci pour l'astuce sur la colonne-ordre majeur de Matlab si, ne le savais pas! – Ghaul

+0

Avez-vous également modifié le résultat à stocker dans la colonne? –

+2

Voir http://www.mathworks.co.uk/company/newsletters/news_notes/june07/patterns.html pour plus d'informations sur l'accès à la mémoire MATLAB – Nzbuu

1

Une solution si vous avez vraiment besoin de performance est de faire votre propre MEX appelant une bibliothèque de transformée en ondelettes discrètes C comme vous le souhaitez.

+0

Oui, je suppose. Si j'ai le temps/l'énergie de le faire, je vais mettre le code dans l'échange de fichiers. – Ghaul

+0

Ce serait génial! Vous n'êtes probablement pas le seul à avoir besoin de ça. –

Questions connexes