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