我有一个功能,我从四个随机源接收输入数据和其他数据。此功能必须重复12次,并且应设置12次。此功能也应重复10次。是否有更紧凑的方式来执行我正在做的事情?
setRoot
答案 0 :(得分:1)
您目前面临的最大问题是您有12个独立的变量来执行12个相关操作。不要那样做。将所有变量合并到一个容器中,然后遍历容器。
我有以下建议:
将X_1
,X_2
,... X_12
合并到一个容器中。在此可以谨慎使用单元阵列或结构。在这种情况下,我将使用单元格数组,因为您的代码目前使用它们,这可能是您转换到最容易的事情。
为训练和测试集数据和标签创建四个主单元格数组,并在每个单元格数组中包含包含每个试验的嵌套单元格数组。
循环在步骤#1中创建的单元阵列,并将结果分配给四个主单元阵列中的每一个。
因此,想到这样的事情:
X = {X_1, X_2, X_3, X_4, X_5, X_6, X_7, X_8, X_9, X_10, X_11, X_12};
Y = {Y_1, Y_2, Y_3, Y_4, Y_5, Y_6, Y_7, Y_8, Y_9, Y_10, Y_11, Y_12};
N = numel(X);
num_iterations = 10;
X_train = cell(1, num_iterations);
Y_train = cell(1, num_iterations);
X_test = cell(1, num_iterations);
Y_test = cell(1, num_iterations);
Percent = 0.7;
for ii = 1 : num_iterations
for jj = 1 : N
vals = X{jj};
labels = Y{jj};
num_points = size(vals,1);
split_point = round(num_points*Percent);
sequence = randperm(num_points);
X_train{ii}{jj} = vals(sequence(1:split_point),:);
Y_train{ii}{jj} = labels(sequence(1:split_point));
X_test{ii}{jj} = vals(sequence(split_point+1:end),:);
Y_test{ii}{jj} = labels(sequence(split_point+1:end));
end
end
因此,要访问特定迭代的训练数据,您可以这样做:
data = X_train{ii};
ii
是您要访问的迭代。 data
现在是一个单元格数组,因此如果您想访问特定组的培训数据,您现在可以执行以下操作:
group = data{jj};
jj
是您要访问的群组。但是,您可以通过以下方式将其合并为一步:
group = X_train{ii}{jj};
您将在我上面编写的代码的各个部分中看到此语法。您对代码中的其他数据(X_test, Y_train, Y_test
)执行相同操作。
我认为你会同意这个更紧凑,更重要。