从向量中提取值并根据其原始顺序对其进行排序

时间:2018-08-15 23:33:06

标签: matlab sorting vector

我有一个数字(温度)向量,并且我正在使用MATLAB函数mink从该向量中提取5个最小的数字,以形成一个新变量。但是,使用mink提取的数字会自动从这5个数字的最低到最大排序。理想情况下,我想保留数字的顺序,因为它们排列在原始向量中。我希望我的问题很容易理解。我感谢任何建议。

2 个答案:

答案 0 :(得分:2)

您使用的函数mink是在MATLAB 2017b中引入的。它具有(as Andras Deak mentioned)两个输出参数:

[B,I] = mink(A,k);

第二个输出参数是索引,例如B == A(I)

要获取集合B但按照在A中出现的顺序进行排序,只需对索引I的向量进行排序:

B = A(sort(I));

例如:

>> A = [5,7,3,1,9,4,6];
>> [~,I] = mink(A,3);
>> A(sort(I))
ans =
     3     1     4

对于较旧的MATLAB版本,可以使用mink复制sort

function [B,I] = mink(A,k)
  [B,I] = sort(A);
  B = B(1:k);
  I = I(1:k);

请注意,在上面,您不需要B输出,您的ordered_mink可以编写如下

function B = ordered_mink(A,k)
  [~,I] = sort(A);
  B = A(sort(I(1:k)));

注意::该解决方案假定A是向量。有关矩阵A,请参见Andras' answer,他与此同时写了该矩阵。

答案 1 :(得分:1)

首先,您需要使用其两个输出形式从mink提取值的相应索引:

[vals, inds] = mink(array);

然后,您只需要根据val中递增的索引来订购inds中的项目。有多种方法可以执行此操作,但是它们都围绕着对inds进行排序并在vals上使用相应的顺序。最简单的方法是将这些向量放入矩阵并对行进行排序:

sorted_rows = sortrows([inds, vals]); % sort on indices

然后提取相应的列

reordered_vals = sorted_rows(:,2); % items now ordered as they appear in "array"

在上述对mink的调用之后,进行排序的一种不太直接的可能性是采用inds的排序顺序,并使用其倒数对vals进行反向排序:

reverse_inds = inds; % just allocation, really
reverse_inds(inds) = 1:numel(inds); % contruct reverse permutation
reordered_vals = vals(reverse_inds); % should be the same as previously