我正在使用R语言处理一个230 x 230的矩阵,我想提取其中前10个最大的值及其位置。
但是这个矩阵是相似性矩阵,对角线上的值都是1,因此在搜索最大值时需要排除对角线。
有什么好的方法或命令可以实现吗?
一般来说,一个简洁的方法是使用不常用的arrayInd
函数,它可以为普通向量位置提供行和列位置。这就是which(..., arr.ind = TRUE)
做的事情。以下是您可能会使用的方法:
## creating a random 230x230 matrix
n <- 230;
set.seed(1);
m <- matrix(sample.int(100000, n*n, replace = TRUE), n, n);
diag(m) <- 1;
## function to return n largest values and position for matrix m
nlargest <- function(m, n, sim = TRUE) {
mult <- 1;
if (sim) mult <- 2;
res <- order(m)[seq_len(n) * mult];
pos <- arrayInd(res, dim(m), useNames = TRUE);
list(values = m[res],
position = pos)
}
diag(m) <- NA;
nlargest(m, 10);
# $values
# [1] 1 2 11 12 12 12 13 18 21 22
#
# $position
# row col
# [1,] 59 95
# [2,] 178 202
# [3,] 160 34
# [4,] 83 151
# [5,] 150 194
# [6,] 18 225
# [7,] 13 38
# [8,] 206 182
# [9,] 89 22
#[10,] 142 99
$values; [1] -0.5129030 -0.5129030 -0.4990625 -0.4990625 -0.4980365 -0.4980365 -0.4841525 -0.4841525; [9] -0.4825290 -0.4825290
和类似的位置。我试图稍微修改一下:nlargest <- function(m, n) { ; res <- order(m)[seq_len(n)]; ; pos <- arrayInd(res, dim(m), useNames = TRUE); ; values = m[res] ; position = pos ; list(unique(values), ; unique(position)) ; }
但现在我得到了前5个值。你是如何确定返回值的数量(10)的? - Kwnwpsseq_len(n) * mult
。 - jowalski
...> ...-1e-10
。此外,您可以进行部分排序。 - Rorschach