选择具有最大最小条目的向量



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

我可以将其实现为:

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

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

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

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 变量,首先获取长度为LN向量:

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

相关内容

  • 没有找到相关文章

最新更新