在一个函数中排序多个函数
Sorting several functions in one function
我有一个功能,可以从四个随机来源接收输入数据和其他数据。此功能必须重复 12 次,因此应设置 12。此功能也应重复 10 次。有没有更紧凑的方式来执行我在下面做的事情?
for ii=1:10
Percent=0.7;
num_points1 = size(X_1,1);
split_point1 = round(num_points1*Percent);
sequence1 = randperm(num_points1);
X1_train{ii} = X_1(sequence1(1:split_point1),:);
Y1_train{ii} = Y_1(sequence1(1:split_point1));
X1_test{ii} = X_1(sequence1(split_point1+1:end),:);
Y1_test{ii}= Y_1(sequence1(split_point1+1:end));
num_points2 = size(X_2,1);
split_point2 = round(num_points2*Percent);
sequence2 = randperm(num_points2);
X2_train{ii} = X_2(sequence2(1:split_point2),:);
Y2_train{ii} = Y_2(sequence2(1:split_point2));
X2_test{ii} = X_2(sequence2(split_point2+1:end),:);
Y2_test{ii}= Y_2(sequence2(split_point2+1:end));
.
.
.
.
num_points12 = size(X_12,1);
split_point12 = round(num_points12*Percent);
sequence12 = randperm(num_points12);
X12_train{ii} = X_12(sequence12(1:split_point12),:);
Y12_train{ii} = Y_12(sequence12(1:split_point12));
X12_test{ii} = X_12(sequence12(split_point12+1:end),:);
Y12_test{ii}= Y_12(sequence12(split_point12+1:end));
end
你目前最大的问题是你有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
)。
我想你会同意这更紧凑,更切题。
我有一个功能,可以从四个随机来源接收输入数据和其他数据。此功能必须重复 12 次,因此应设置 12。此功能也应重复 10 次。有没有更紧凑的方式来执行我在下面做的事情?
for ii=1:10
Percent=0.7;
num_points1 = size(X_1,1);
split_point1 = round(num_points1*Percent);
sequence1 = randperm(num_points1);
X1_train{ii} = X_1(sequence1(1:split_point1),:);
Y1_train{ii} = Y_1(sequence1(1:split_point1));
X1_test{ii} = X_1(sequence1(split_point1+1:end),:);
Y1_test{ii}= Y_1(sequence1(split_point1+1:end));
num_points2 = size(X_2,1);
split_point2 = round(num_points2*Percent);
sequence2 = randperm(num_points2);
X2_train{ii} = X_2(sequence2(1:split_point2),:);
Y2_train{ii} = Y_2(sequence2(1:split_point2));
X2_test{ii} = X_2(sequence2(split_point2+1:end),:);
Y2_test{ii}= Y_2(sequence2(split_point2+1:end));
.
.
.
.
num_points12 = size(X_12,1);
split_point12 = round(num_points12*Percent);
sequence12 = randperm(num_points12);
X12_train{ii} = X_12(sequence12(1:split_point12),:);
Y12_train{ii} = Y_12(sequence12(1:split_point12));
X12_test{ii} = X_12(sequence12(split_point12+1:end),:);
Y12_test{ii}= Y_12(sequence12(split_point12+1:end));
end
你目前最大的问题是你有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
)。
我想你会同意这更紧凑,更切题。