我有 151 -by- 151 矩阵A
。它是一个相关矩阵,因此主对角线上有1
个,主对角线上方和下方有重复值。
我正在寻找一种方法来获取n
多行最低值的索引。
我想要查找的行数固定为n
,而n
多行必须是唯一的。
所以,例如,让我们说:
n = 10
和数据如下
第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
。
答案 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