R:具有最大值的列和行索引

R:具有最大值的列和行索引,r,matrix,indices,R,Matrix,Indices,假设我们有一个如下所示的矩阵: -0.3 0.2 0.001 -0.4 0.5 0.25 0.45 0.2 -0.001 0.02 0.8 - 0.2 0.35 0.1 0.1 0.25 -0.14 -0.1 0.02 0.4 现在我想找到矩阵的那个部分,它的维数是2x2,并且其中有最大的元素(绝对值)。 因此,这将是以下指标: 2 1 2 2 3 1 3 2 因为 0.25 0.4 0.8 -0.2 是该矩阵中所有2 x 2矩阵

假设我们有一个如下所示的矩阵:

-0.3  0.2   0.001  -0.4    0.5 
0.25  0.45  0.2    -0.001  0.02
0.8 - 0.2   0.35   0.1     0.1
0.25 -0.14  -0.1   0.02    0.4
现在我想找到矩阵的那个部分,它的维数是2x2,并且其中有最大的元素(绝对值)。 因此,这将是以下指标:

2 1
2 2
3 1 
3 2
因为

0.25 0.4
0.8  -0.2
是该矩阵中所有2 x 2矩阵中具有最大值的部分

如何在R中实现这一点


我举了一个小例子,因为我的实矩阵包含大约4000列和5000行,但这个矩阵中的许多值几乎为零。这很难可视化,因此,出于这个原因,我只想可视化最重要的部分。

您可以使用
找到矩阵的最大索引

set.seed(1234)
mat <- matrix(sample(1:20), ncol = 5)
mat
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    3   14    8   20   17
# [2,]   12   10    6   15   16
# [3,]   11    1    7    2   19
# [4,]   18    4    5    9   13

which(mat == max(mat), arr.ind = TRUE)
#      row col
# [1,]   1   4
问题澄清后编辑

mrow <- nrow(mat); mcol <- ncol(mat)
subs <- list()
for (i in 1:(nrow(mat) - 1)) {
  for (j in 1:(ncol(mat) - 1)) {
    x <- c(i, j, i, j + 1, i + 1, j, i + 1, j + 1)
    subs[[paste0(i, j)]] <- matrix(x, ncol = 2, byrow = TRUE)
  }
}

sums <- sapply(subs, function (x) sum(abs(mat[x]))) 
win <- subs[[which(sums == max(sums))]]
mat[win[1, 1]:(win[1, 1] + 1), win[1, 2]:(win[1, 2] + 1)]
#      [,1] [,2]
# [1,]   20   17
# [2,]   15   16

mrow我的速度会很慢,但我会完成这项工作,这将给出所需子矩阵的行和列索引:

library(magrittr)

df = expand.grid(seq(nrow(mat)-1), seq(ncol(mat)-1)) 

vec = apply(df, 1, function(u){
              mat[u[1]:(u[1]+1),u[2]:(u[2]+1)] %>%
              abs %>%
              sum
      }) 

ind = df[which.max(vec),]
mat[ind[[1]]:(ind[[1]]+1),ind[[2]]:(ind[[2]]+1)]

#     [,1] [,2]
#[1,]   20   17
#[2,]   15   16
其中
mat
为:

mat = structure(c(3L, 12L, 11L, 18L, 14L, 10L, 1L, 4L, 8L, 6L, 7L, 
5L, 20L, 15L, 2L, 9L, 17L, 16L, 19L, 13L), .Dim = 4:5)
该软件包提供快速滚动求和功能,可能会有所帮助。下面是一个在大型矩阵上快速运行的答案:

n <- matrix(rnorm(4000*5000),nrow=4000,ncol=5000)


find_idx_max_square <- function(matrix) {
  library(RcppRoll)
  o <- apply(abs(matrix), 2,roll_suml,n=2L)
  p <- t(apply(o, 1,roll_suml,n=2L))
  idx <- which(p == max(p,na.rm=TRUE),arr.ind=TRUE)
  return(idx)
}

find_idx_max_square(n)
      row col
[1,] 1837 724

> system.time(find_idx_max_square(n))
utilisateur     système      écoulé 
  1.863          0.159       2.023 

n谢谢你的回答,但这不是我问题的确切答案。我想要矩阵矩阵的那一部分,一个2 x 2矩阵,它有最大的值。你的意思是在你想要的输出中有一个0.45而不是0.4吗?是的,它希望有一个2 x 2矩阵,其中有最大的元素和(与绝对值一起工作)。希望下面的帮助。
n <- matrix(rnorm(4000*5000),nrow=4000,ncol=5000)


find_idx_max_square <- function(matrix) {
  library(RcppRoll)
  o <- apply(abs(matrix), 2,roll_suml,n=2L)
  p <- t(apply(o, 1,roll_suml,n=2L))
  idx <- which(p == max(p,na.rm=TRUE),arr.ind=TRUE)
  return(idx)
}

find_idx_max_square(n)
      row col
[1,] 1837 724

> system.time(find_idx_max_square(n))
utilisateur     système      écoulé 
  1.863          0.159       2.023