查找具有最低值

时间:2015-11-16 14:02:23

标签: matlab

我有 151 -by- 151 矩阵A。它是一个相关矩阵,因此主对角线上有1个,主对角线上方和下方有重复值。

我正在寻找一种方法来获取n多行最低值的索引。

我想要查找的行数固定为n,而n多行必须是唯一的。

所以,例如,让我们说:

n = 10

和数据如下

Part of the matrix

第1行涉及最低相关性(行/列6),以及第三低相关性(行/列9)。

这意味着我找到了我需要的三行的索引:1,6和9.但是,我不计算第1行两次,因此我仍然需要找到索引还有7行。

我尝试过这种方法

function [smallestNElements smallestNIdx] = getNElements(A, n)
     [ASorted AIdx] = sort(A);
     smallestNElements = ASorted(1:n);
     smallestNIdx = AIdx(1:n);
end

我获得了here。但是,我认为这种方法基本上不适用,因为它意味着适用于矢量。当我将它应用于我的2D矩阵时,它只给出第一列中最低值的索引。

最低,我的意思是绝对值最低,而不是"最接近零"。因此-0.9低于-0.1,而0.05则低于viewDidLoad

2 个答案:

答案 0 :(得分:4)

首先,通过制作Inf来消除重复的值,这样他们就不会被误认为是最低值:

A1 = tril(A);
A1(A1==0) = Inf;

现在找到n最小的索引:

[~,idx] = sort(A1(:));
[r,c] = ind2sub(size(A), idx(1:n));

找到最低n相关性,如果您希望n行涉及最低相关性而不重复它们

[~,idx] = sort(A(:));
[r,c] = ind2sub(size(A), idx);
rows = unique(r,'stable');
result = rows(1:n)

答案 1 :(得分:1)

这是我的解决方案

[~, idx] = sort(sum(A));
results = idx(1:n);

这是如何工作的,sum取代了矩阵的列。这给我留下了1 x columns向量。向量从最小到最大排序,并保留索引。然后保留第一个n个索引作为结果。以下是使用n=4

数据的结果
result = 
    1
    6
    9
    8