用于在矩阵中找到矩形

时间:2014-08-31 13:20:54

标签: r matrix

我正在按照这种方法在(0,1)矩阵中找到1的矩形

Find 5 consecutive numbers >= 3 for each row of a matrix

但是当我尝试找到像此矩阵中的1x4矩形(1行和4列)时出现问题

m <- matrix(c(0,1,1,1,1,0,0,0,1,0,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0), nrow = 6, ncol = 5, byrow = TRUE)

有四个矩形:第1行,第4行,第5行和第6行

   [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    1    1    1
[2,]    0    0    0    1    0
[3,]    1    0    0    1    0
[4,]    1    1    1    1    0
[5,]    0    1    1    1    1
[6,]    1    1    1    1    0

当我运行这个案例的代码时,我得到了4个结果,但是其中两个(第4行和第6行)两个结果都从第一列开始,但结果我得到的是第5列的起始列和第8列的结束列矩阵是6x5,无法找出问题所在。

b<-m

for (j in 1:5){
cont<-1
 for (i in 6:1) {
 if (m[i,j]==0){
cont<-1
b[i,j]<-NA}
 else {b[i,j]<-cont
cont<-cont+1}
}
}


mdat<-b

apply(mdat, 1, function(x) {
  r <- rle(x >= 1)
  w <- which(!is.na(r$values) & r$values & r$lengths >=4)
  if (length(w) > 0) {
    before <- sum(r$lengths[1:(w[1]-1)])
    c(before+1,before+ r$lengths[w[1]])
  } else
    NULL
})

[[1]]
[1] 2 5

[[2]]
NULL

[[3]]
NULL

[[4]]
[1] 5 8

[[5]]
[1] 2 5

[[6]]
[1] 5 8

1 个答案:

答案 0 :(得分:2)

您需要更改before变量的计算,因为如果行以1的序列开头,它不起作用:

apply(mdat, 1, function(x) {
  r <- rle(x >= 1)
  w <- which(!is.na(r$values) & r$values & r$lengths >=4)
  if (length(w) > 0) {
    before <- sum(r$lengths[1:w[1]]) - r$lengths[w[1]]
    c(before+1,before+r$lengths[w[1]])
  } else
    NULL
})

问题如下:

before <- sum(r$lengths[1:(w[1]-1)])

仅当1的序列不在第一个位置(即w> 1)时才能正常工作。

顺便说一句,请注意,您的代码只考虑行中的第一个序列,忽略其他序列(如果存在) 例如假设有一个矩阵row = c(0,1,1,1,1,0,1,1,1,1),它只返回c(2,5)而不是c(2,5), c(7,10)

如果您想要返回所有序列的内容,可以使用以下代码:

apply(mdat, 1, function(x) {
  r <- rle(x >= 1)
  w <- which(!is.na(r$values) & r$values & r$lengths >=4)
  if (length(w) > 0) {
    lapply(w,FUN=function(w1){ before <- sum(r$lengths[1:w1]) - r$lengths[w1];
                               c(before+1,before+r$lengths[w1]) })
  } else
    NULL
})

N.B。它返回一个列表,其中每个元素都是包含对

的列表