【问题标题】:Matlab dwt across specified dimensionMatlab dwt 跨指定维度
【发布时间】:2011-10-12 12:47:27
【问题描述】:

我在 Matlab 中有一个大小为 65536 x 192 的数据集 Sig。如果我想沿第二维获取一维 fft,我可以做一个 for 循环:

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

或者我可以指定维度并在没有 for 循环的情况下执行:

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

这对我的数据集来说快了大约 20 倍。

我已经为离散小波变换 (dwt) 寻找类似的东西,但找不到。所以我想知道是否有人知道在 Matlab 中跨指定维度执行 dwt 的方法?还是我必须使用 for 循环?

【问题讨论】:

  • 我的第一次尝试只是转置,但似乎dwt 总是为 2D 输入返回 1D 结果??

标签: matlab dwt


【解决方案1】:

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

【讨论】:

  • 对列进行操作确实让我的速度提高了 6 倍,但 for 循环仍然(不出所料)比直接代码慢得多。因此,跨指定维度的 dwt 仍然是可取的。感谢您提供有关 Matlab 列主要顺序的提示,但不知道!
  • 您是否也将结果更改为存储在列中?
  • 有关 MATLAB 内存访问的更多信息,请参阅 mathworks.co.uk/company/newsletters/news_notes/june07/…
  • 是的。 for 循环现在大约需要 1.4 秒,而直接方法对于 fft 大约需要 0.2 秒。问题是 dwtfft.. 慢得多
【解决方案2】:

如果您确实需要性能,一个解决方案是按照您想要的方式调用 C 离散小波变换库来执行您自己的 MEX。

【讨论】:

  • 是的,我想是的。如果我有时间/精力去做,我会把代码放在文件交换中。
  • 那太好了!你可能不是唯一需要这个的人。
【解决方案3】:

我假设您正在使用小波工具箱中的函数:http://www.mathworks.co.uk/help/toolbox/wavelet/ref/dwt.html

文档似乎没有描述作用于数组,因此它可能不受支持。如果它确实允许你输入一个数组,那么它将在第一个非单维上进行操作,或者它会忽略形状并将其视为向量。

【讨论】:

  • 我想这是正确的答案,所以我会接受它,但它不是很有用/有帮助,所以你没有得到支持:p(只有几个 0投票接受的答案,你会得到一个金徽章!;))
  • :) 对不起。希望我有更好的说法。我想 Wavelet Toolbox 预计您只会将 dwt 用于一维数据,将dwt2 用于二维数据。我在 R2010b 中使用 fftgpuArray 版本时遇到了完全相同的问题,尽管我没有机会再试一次。
猜你喜欢
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 2020-05-26
  • 2015-10-21
  • 1970-01-01
相关资源
最近更新 更多