Matlab 优化循环:操作简单,但大量迭代需要较长时间

Matlab 优化循环:操作简单,但大量迭代需要较长时间,matlab,loops,optimization,Matlab,Loops,Optimization,我正在运行一段花费了将近70个小时的Matlab代码,我确信有一种更有效的方法来编写脚本,但我不知道如何编写。 循环1次迭代需要1秒。当然,问题是长度(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

我正在运行一段花费了将近70个小时的Matlab代码,我确信有一种更有效的方法来编写脚本,但我不知道如何编写。 循环1次迭代需要1秒。当然,问题是长度(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

有没有人有一个聪明的建议来优化这个循环?非常感谢

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

h_norm = repmat(braindip(i,:), size(nobrain,1),1);
nn = sqrt(sum((h_norm - 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()
也是旧版本支持的选项。刚刚意识到您正在寻找最近的点
dsearchn
可能比自己编写更快。
nn_qbd_min = min(sum((braindip(i,:) - nobrain).^2,2));
if nn_qbd_min > alpha_qbd