首页 > 解决方案 > 选择具有最大最小条目的向量

问题描述

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

我可以将其实现为:

  1. 按升序对每个向量的条目进行排序。

  2. 比较第一个最小的条目并选择具有最大最小值的对应向量。如果有多个向量,我会比较其中第二小的条目。我仍然有多个具有相同第二小的向量,然后我比较第三个等等,直到我得到单个向量。

例如,我开始生成向量如下,但我不知道如何继续获得上述条件。

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)and mat(:,:,2)

然后,我比较第二个最小的mat(:,:,3)mat(:,:,4)- 都有 3 个,所以我不能选择任何一个。然后,比较第三小,还是一样。现在我比较第 4 个最小值,我发现mat(:,:,4)它的值比 6 大 9。

有人可以帮我在 MATLAB 中获得这个解决方案吗?

标签: matlabsortingcompare

解决方案


我认为您应该使用较少维度的矩阵并使用逻辑矩阵。所以让我们开始吧

我还将更改 de 变量,首先获取N长度向量L

>> 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对 Length 的向量进行了排序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

推荐阅读