我正在运行一段需要近 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));
自
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
将原始代码与第三个选项进行比较,执行时间大致减少了一半。