在R中查找矩阵中的最大值

3

我正在使用R语言处理一个230 x 230的矩阵,我想提取其中前10个最大的值及其位置。

但是这个矩阵是相似性矩阵,对角线上的值都是1,因此在搜索最大值时需要排除对角线。

有什么好的方法或命令可以实现吗?


你的矩阵不是方阵吗? - Rorschach
非常抱歉,是的,这是相似之处。我打错字了。 - Kwnwps
1
请提供一个可重现的示例。 - Rich Scriven
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Rorschach
哦,还可以在那里添加一个epsilon,这样您就不会错过最后一个了,...> ...-1e-10。此外,您可以进行部分排序。 - Rorschach
显示剩余2条评论
1个回答

6

一般来说,一个简洁的方法是使用不常用的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

1
太好了!一个小细节是,由于我有一个相似度矩阵,我得到了两次5个最大值 $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)的? - Kwnwps
1
只需修改结果,以便在矩阵是相似性矩阵的情况下,将选择前n个条目的索引加倍,因此它选择2、4、6、...而不是1、2、3...这是seq_len(n) * mult - jowalski
只是提醒一下...从今天开始,你需要添加 decreasing 参数才能使其正常工作。>> order(m, decreasing = TRUE) - Nikhil Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接