2011-10-12 25 views
1

我在Matlab中有一个大小65536 x 192的数据集Sig。如果我要带一维FFT沿第二个维度,我既可以做一个for循环:指定维数的Matlab dwt

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

或者我可以指定尺寸,做没有for循环:

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

这比我的数据集快大约20倍。

我已经找到了类似的离散小波变换(dwt)的东西,但一直无法找到它。所以我想知道是否有人知道在Matlab中指定维度上的dwt?或者我必须使用循环?

+0

我的第一次尝试是转置,但似乎'dwt'总是返回2D输入的一维结果? –

回答

0

我相信你正在使用从小波工具箱功能:http://www.mathworks.co.uk/help/toolbox/wavelet/ref/dwt.html

文档似乎并不说明作用阵列上,所以它可能是不支持。如果它确实允许你输入一个数组,那么它将在第一个非单实体维上运行,否则它将忽略该形状并将其视为向量。

+0

我想这是正确的答案,所以我会接受它,但它不是非常有用/有帮助,所以你没有得到一个upvote:p(只有几个0投票接受的答案,你会得到一个黄金徽章!)) – Ghaul

+0

:)对不起。希望我有更好的说法。我猜想小波工具箱希望你只能在2D数据中使用带有1D数据和带有2D数据的'dwt2'的'dwt'。我在R2010b中遇到了与'fft'的gpuArray版本完全相同的问题,虽然我没有机会再试一次。 – Nzbuu

2

在你的循环FFT例子中,似乎你在线上操作。 Matlab使用一个Column-major order。它可以解释性能的差异。如果您在列上操作,性能是否相同? 如果这是正确的解释,您可以在循环中使用dwt

+0

在列上操作确实给了我6倍的加速,但* for *循环仍然(不出所料)比直接代码慢得多。因此,指定维度中的* dwt *仍然是可取的。感谢关于Matlab的列主要命令的提示,但不知道! – Ghaul

+0

您是否也更改了要存储在列中的结果? –

+2

有关MATLAB存储器访问的更多信息,请参阅http://www.mathworks.co.uk/company/newsletters/news_notes/june07/patterns.html – Nzbuu

1

如果您真的需要性能,一个解决方案就是自己做MEX,以您想要的方式调用C离散小波变换库。

+0

是的,我想是的。如果我有时间/精力去做,我会把代码放在文件交换中。 – Ghaul

+0

那太棒了!你可能不是唯一需要这个的人。 –