选择最小条目最大的向量

时间:2018-06-24 04:13:37

标签: matlab sorting compare

我生成L个随机向量。我想选择具有最大最小值的向量,即最大化最小值(max-min)。

我可以这样实现:

  1. 将每个向量的条目按升序排序。

  2. 比较第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中获得此解决方案吗?

1 个答案:

答案 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