我生成L
个随机向量。我想选择具有最大最小值的向量,即最大化最小值(max-min)。
我可以这样实现:
将每个向量的条目按升序排序。
比较第1个最小的条目,并选择具有最大最小值的相应向量。如果有多个向量,我将比较第二个最小的向量。仍然有多个向量具有相同的第二个最小值,然后比较第三个,依此类推,直到获得单个向量。
例如,我开始如下生成向量,但是我不知道如何继续获得上述条件。
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)
具有比mat(:,:,1)
和mat(:,:,2)
(具有1)最大的第一最小值(为2)。因此,我可以忽略mat(:,:,1)
和mat(:,:,2)
。
然后,我比较mat(:,:,3)
和mat(:,:,4)
的第二小-都为3,所以我不能选择任何一个。然后,比较第3个最小的,仍然相同。现在,我比较发现mat(:,:,4)
具有较大值(比6大9)的第4个最小值。
有人可以帮助我在MATLAB中获得此解决方案吗?
答案 0 :(得分:1)
我认为您应该使用较少的维度矩阵并使用逻辑矩阵。 所以我们开始吧
我还将更改变量,首先获取长度为N
的{{1}}个向量:
L
我们创建一个矩阵N * L,其中将包含向量
>> N = 5;
>> L = 10;
然后使用matlab函数从算法开始,对矩阵的每一行进行排序:
>> 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
因此,现在我们有了>> 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