【发布时间】:2018-12-07 06:44:35
【问题描述】:
我必须执行这个循环:
load('Y');
X_test = ...;
Y_test = ...;
X_train = ...;
Y_train = ...;
for i=1:length(Y.Y)
if Y.Y(i,1) == l
current_test_data = [current_test_data; X_test(i,:)];
current_test_labes = [current_test_labes; Y_test(i,:)];
else
current_train_data = [current_train_data; X_train(i,:)];
current_train_labes = [current_train_labes; Y_train(i,:)];
end
end
但是 length(Y.Y) 是 2300250 所以这个执行需要很长时间。有更快的方法吗?
【问题讨论】:
-
您附加错误。如果您需要追加,请执行
x(end+1)=0,而不是x=[x,0]。见here。但更好的是预先分配。您可以通过创建一个足够大的数组来容纳尽可能大的输出,然后在循环结束时对其进行修剪,从而获得巨大的收益。像你在这里做的那样在循环中递增数组是非常昂贵的。 -
预分配例如我的代码中的什么?你指的是“current_test_data”之类的?
-
是的,创建一个足够大的数组来保存您要保存的数据,因此您不需要将数据附加到数组中。见:mathworks.com/help/matlab/matlab_prog/preallocating-arrays.html
-
是的。试试看。
-
这里不能只使用逻辑索引吗?摆脱循环并使用
idx = (Y.Y(:,1) == l); current_test_data = X_test(idx, :); current_test_labes = Y_test(idx,:);等?如果这不起作用,请提供minimal reproducible example,我们可以对其进行测试。
标签: matlab performance for-loop