【问题标题】:Optimising loop: simple operations but large number of iterations taking long优化循环:操作简单但大量迭代耗时长
【发布时间】:2020-05-20 17:26:16
【问题描述】:

我正在运行一段 Matlab 代码,它需要将近 70 个小时,我确信有一种更有效的编写脚本的方法,但我不知道怎么做。 循环 1 次迭代需要 1 秒。问题当然是 length(i) 是 186144。

braindip = normrnd(0, 50, 186144,3);
nobrain = normrnd(0, 45, 25014656,3);

ok = 1; 
alpha = 2;
h = waitbar(0,'Please wait...');
dip_away = nan(size(braindip));
for i = 1:size(braindip,1)
  tic
  h_norm = repmat(braindip(i,:), size(nobrain,1),1);
  nn = sqrt(sum((h_norm - nobrain).^2,2));

  if min(nn) > alpha
    dip_away(ok,:) = braindip(i,:);
    ok = ok+1;
  end
  toc
  waitbar(i / size(braindip,1))
end

有人对优化这个循环有什么聪明的建议吗?非常感谢!

【问题讨论】:

  • 刚刚意识到您正在寻找最近的点。 dsearchn 可能比自己编码更快。

标签: matlab loops optimization


【解决方案1】:

假设您使用的是支持自动广播的 MATLAB 2016b 或更高版本,您可以更改:

h_norm = repmat(braindip(i,:), size(nobrain,1),1);
nn = sqrt(sum((h_norm - nobrain).^2,2));

nn = sqrt(sum((braindip(i,:) - nobrain).^2,2));

第二种选择是消除 sqrt。使用:

nn_qbd = sum((braindip(i,:) - nobrain).^2,2);
if min(nn_qbd) > alpha_qbd

其中alpha_qbd=alpha.^2,显然只提前计算了一次。这导致第三步,无需将 nn_qbd 存储在变量中。您只对最低限度感兴趣:

nn_qbd_min = min(sum((braindip(i,:) - nobrain).^2,2));
if nn_qbd_min > alpha_qbd

将原始代码与第三个选项相比,执行时间大致减少了一半。

【讨论】:

  • bsxfun() 也是旧版本支持的选项。
猜你喜欢
  • 2013-05-29
  • 2016-12-07
  • 2020-04-17
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多