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