我生成L
数量的随机向量。我想选择具有最大最小值的向量,即最大化最小值(最大-最小值(。
我可以将其实现为:
-
按递增顺序对每个向量的条目进行排序。
比较第一个最小值的 条目,并选择具有最大最小值的相应向量。如果有多个向量,我比较其中第二小的条目。我仍然有多个向量具有相同的第二小向量,然后我比较第三向量,依此类推,直到我得到一个向量。
例如,我开始生成如下向量,但我不知道如何继续获得上述条件。
K=1;N =9;L=4;
mat=zeros(K,N,L); sortmat=zeros(K,N,L);
for j=1:L
mat(:,:,j)=randperm(15,N);
sortmat(:,:,j)=sort(mat(:,:,j));
end
mat
sortmat
在一个案例中,我得到了:
mat(:,:,1) =
1 12 15 14 9 6 2 10 5
mat(:,:,2) =
7 12 5 9 15 4 11 1 10
mat(:,:,3) =
7 14 2 3 11 5 13 6 10
mat(:,:,4) =
12 3 13 5 11 9 14 2 10
sortmat(:,:,1) =
1 2 5 6 9 10 12 14 15
sortmat(:,:,2) =
1 4 5 7 9 10 11 12 15
sortmat(:,:,3) =
2 3 5 6 7 10 11 13 14
sortmat(:,:,4) =
2 3 5 9 10 11 12 13 14
在本例中,我应该选择mat(:,:,4)
向量。因为:
mat(:,:,3)
和mat(:,:,4)
具有第一个最小值(即 2(中的最大值,而不是mat(:,:,1)
和mat(:,:,2)
(它们有 1(。所以我可以忽略mat(:,:,1)
和mat(:,:,2)
.
然后,我比较了mat(:,:,3)
和mat(:,:,4)
中第二小的 - 两者都有 3 个,所以我无法选择任何一个。然后,比较第三小,仍然相同。现在我比较第 4 个最小的值,我发现mat(:,:,4)
具有比 6 大 9 的值。
有人可以帮助我在 MATLAB 中获得此解决方案吗?
我认为你应该使用较少维度的矩阵并使用逻辑矩阵。 所以让我们开始
我还将更改 de 变量,首先获取长度为L
的N
向量:
>> N = 5;
>> L = 10;
让我们创建一个矩阵 N * L,它将包含向量
>> rand_matrix = randi([0,25],N,L)
rand_matrix =
12 20 12 19 4 14 16 3 20 21
11 12 3 6 7 11 24 15 9 6
11 0 8 23 2 16 5 11 17 15
20 4 15 6 14 16 18 11 10 15
8 18 4 19 17 17 6 17 21 14
从你的算法开始,使用 matlab 函数,对矩阵的每一行进行排序:
>> sort_rand_matrix = sort(rand_matrix,2)
sort_rand_matrix =
3 4 12 12 14 16 19 20 20 21
3 6 6 7 9 11 11 12 15 24
0 2 5 8 11 11 15 16 17 23
4 6 10 11 14 15 15 16 18 20
4 6 8 14 17 17 17 18 19 21
所以现在我们有N=5
长度L=10
的排序向量,现在让我们开始使用逻辑矩阵,首先我们只想要第一列的最大值:
>> TF1 = sort_rand_matrix(:,1) == max(sort_rand_matrix(:,1))
TF1 =
5×1 logical array
0
0
0
1
1
>> sort_rand_matrix(not(TF1),:) = []
sort_rand_matrix =
4 6 10 11 14 15 15 16 18 20
4 6 8 14 17 17 17 18 19 21
>> TF2 = sort_rand_matrix(:,2) == max(sort_rand_matrix(:,2))
TF2 =
2×1 logical array
1
1
>> sort_rand_matrix(not(TF2),:) = []
sort_rand_matrix =
4 6 10 11 14 15 15 16 18 20
4 6 8 14 17 17 17 18 19 21
>> TF3 = sort_rand_matrix(:,3) == max(sort_rand_matrix(:,3))
TF3 =
2×1 logical array
1
0
>> sort_rand_matrix(not(TF3),:) = []
sort_rand_matrix =
4 6 10 11 14 15 15 16 18 20
您可以看到,在每次迭代中,我们都会删除与条件不匹配的行
最后,我们可以尝试自动化此操作。请注意,删除每个步骤中无效的行很重要,因为最大值可能在错误的行中,并且还要注意,当您只有一个元素时,您可以停止for
循环,让我们完成每次迭代:
for i = 1:L
TF = sort_rand_matrix(:,i) == max(sort_rand_matrix(:,i))
if length(TF) == 1
break
end
sort_rand_matrix(not(TF(:,i)),:) = []
end
让我们尝试一个完整的大样本:
>> rand_matrix = randi([0,25],N,L)
rand_matrix =
16 5 8 15 2 25 0 2 0 4 1 17 4 7 24 7 0 16 6 23
9 7 24 6 6 14 23 16 19 6 17 13 10 11 23 18 14 9 7 22
21 12 11 15 20 13 23 12 13 23 1 25 21 0 1 17 22 4 16 21
13 5 4 18 0 6 20 20 12 0 1 16 20 25 19 14 17 11 6 6
9 21 23 5 24 12 2 18 23 12 13 20 1 4 6 18 4 12 21 15
24 5 25 3 18 16 6 23 15 4 2 11 10 2 10 17 9 3 25 0
22 5 11 7 12 17 8 23 16 25 21 11 13 9 14 4 11 15 18 11
14 4 2 8 15 10 17 8 22 18 21 21 10 5 24 3 25 5 8 8
16 5 6 11 6 9 3 18 20 13 18 2 17 12 10 25 4 10 15 4
15 11 10 13 11 25 18 5 14 12 3 3 16 8 25 4 22 15 2 4
>> sort_rand_matrix = sort(rand_matrix,2)
sort_rand_matrix =
0 0 0 1 2 2 4 4 5 6 7 7 8 15 16 16 17 23 24 25
6 6 6 7 7 9 9 10 11 13 14 14 16 17 18 19 22 23 23 24
0 1 1 4 11 12 12 13 13 15 16 17 20 21 21 21 22 23 23 25
0 0 1 4 5 6 6 6 11 12 13 14 16 17 18 19 20 20 20 25
1 2 4 4 5 6 9 12 12 12 13 15 18 18 20 21 21 23 23 24
0 2 2 3 3 4 5 6 9 10 10 11 15 16 17 18 23 24 25 25
4 5 7 8 9 11 11 11 11 12 13 14 15 16 17 18 21 22 23 25
2 3 4 5 5 8 8 8 8 10 10 14 15 17 18 21 21 22 24 25
2 3 4 4 5 6 6 9 10 10 11 12 13 15 16 17 18 18 20 25
2 3 3 4 4 5 8 10 11 11 12 13 14 15 15 16 18 22 25 25
>> for i = 1:L
TF = sort_rand_matrix(:,i) == max(sort_rand_matrix(:,i));
if length(TF) == 1
break
end
sort_rand_matrix(not(TF),:) = [];
end
>> sort_rand_matrix
sort_rand_matrix =
6 6 6 7 7 9 9 10 11 13 14 14 16 17 18 19 22 23 23 24