【问题标题】:MATLAB For loop optimizationMATLAB For 循环优化
【发布时间】:2017-11-13 13:12:18
【问题描述】:

我是 MATLAB 的新手,还不知道它的功能和编程方式。

我有一个 3D 矩阵:19*1000*134,其中包含我想用巴特沃思过滤的数据。 我做了一个双循环的代码,效果很好:

%% Filtering
w1 = 1/(fs/2);
w2 = 45/(fs/2);
[b, a] = butter(6, [w1 w2], 'bandpass');

for i=1:channel
    for j=1:nb_epoch
        Data_filtered(i,:,j) = filtfilt(b, a, s_EEG.data(i,:,j));
    end
end

有没有其他方法可以更好地做同样的事情?由于我不了解 MATLAB,因此我不确定这是实现此带通滤波器的最佳方式。

谢谢!

【问题讨论】:

  • 这听起来很对。
  • FEX 有一个FiltFiltM 函数。优点是,它能够沿某个维度处理矩阵。但是我不确定这会快多少
  • 仅供参考,下面选择的答案不会按书面形式运行。不允许运行嵌套的 parfor 循环。
  • 是的,它被注意到了。我只用过一个,挺好看的。谢谢大家!

标签: matlab loops for-loop


【解决方案1】:

我能想到的唯一优化是使用 parfors:

w1 = 1/(fs/2);
w2 = 45/(fs/2);
[b, a] = butter(6, [w1 w2], 'bandpass');

parfor i=1:channel
    parfor j=1:nb_epoch
        Data_filtered(i,:,j) = filtfilt(b, a, s_EEG.data(i,:,j));
    end
end

请记住,第一次运行 parfors 时,由于 worker 池是空的,因此脚本会慢得多,因为 worker 必须被实例化和初始化。多线程应该会有所帮助。

【讨论】:

  • 你能解释一下什么是 parfor 吗?什么是工人池?我正在努力获得有关 Matlab 的工作知识,这对我来说真的很有用。
  • Parfors 只不过是在多线程上下文中执行的 for 循环迭代。为简化起见,这意味着任务被拆分为多个子任务,每个 Matlab 工作人员被分配到一个子任务。详细信息:it.mathworks.com/help/distcomp/parfor.html
  • 但是,如果将任务分成多线程,我可以理解它会更快,但是为什么我们第一次运行它会慢呢?如果您运行一次,然后再与另外 2 个循环在另一组数据上运行会发生什么?
  • 而且由于 parfor 没有以确定的方式执行循环,这是否意味着位置 (4 , : , 25) 的数据可以被过滤并放置在位置 (18 , : ,第130章)?
  • @TommasoBelluzzo mathworks.com/help/distcomp/… 你不能嵌套 parfor 循环。因此,您必须将其中一个循环切换回常规的for 循环。将外部循环设为parfor,将内部循环设为常规for,您可能会获得最佳速度
猜你喜欢
  • 2020-10-19
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2019-05-31
  • 2015-01-13
  • 1970-01-01
相关资源
最近更新 更多