有谁知道如何对最大 K 进行子集化,使得 K x K 是具有所有相同元素的子矩阵,即该子矩阵中的所有元素必须与给定的 N x N 矩阵相同? 我在除 R 之外的其他编程语言中找到了许多示例。如果您知道,我也更喜欢dplyr

有其他语言的解决方案链接: https : //www.geeksforgeeks.org/maximum-size-sub-matrix-with-all-1s-in-a-binary-matrix/

但是当所有相同的元素彼此相邻时,此链接提供了一种特殊情况。 它检索相同元素的最大块,而不是一般的子矩阵。 我不想用这种条件限制子集。

#1楼 票数:2

这是一个基本的 R 实现。

如果要搜索非方阵内的最大方阵子矩阵,可以试试下面的代码:

r <- list()
for (w in rev(seq(min(dim(M))))) {
  for (rs in seq(nrow(M)-w+1)) {
    for (cs in seq(ncol(M)-w+1)) {
      mat <- M[rs-1+(1:w),cs-1+(1:w)]
      u <- unique(c(mat))
      if (all(u!=0) &length(u)==1) r[[length(r)+1]] <- mat
    }
  }
  if (length(r)>0) break
}

以至于

> r
[[1]]
     [,1] [,2]
[1,]    3    3
[2,]    3    3

[[2]]
     [,1] [,2]
[1,]    2    2
[2,]    2    2

[[3]]
     [,1] [,2]
[1,]    3    3
[2,]    3    3

[[4]]
     [,1] [,2]
[1,]    2    2
[2,]    2    2

[[5]]
     [,1] [,2]
[1,]    1    1
[2,]    1    1

[[6]]
     [,1] [,2]
[1,]    1    1
[2,]    1    1

[[7]]
     [,1] [,2]
[1,]    3    3
[2,]    3    3

[[8]]
     [,1] [,2]
[1,]    3    3
[2,]    3    3

数据

M <- structure(c(1L, 3L, 1L, 2L, 1L, 3L, 3L, 2L, 2L, 3L, 3L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 3L, 1L, 3L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 
2L, 2L, 1L, 3L, 1L, 3L, 2L, 2L, 2L, 2L, 3L, 2L, 1L, 3L, 2L, 1L, 
1L, 3L, 2L, 2L, 3L, 3L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 
3L, 3L, 2L, 3L, 3L, 2L, 3L, 3L, 1L, 1L, 1L, 1L, 3L, 2L, 3L, 1L, 
1L, 2L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 1L, 3L, 3L, 3L, 2L, 2L, 2L, 
3L, 2L, 2L, 3L, 3L, 3L, 1L, 2L, 2L, 1L, 3L, 3L, 2L, 3L, 2L, 1L, 
2L, 1L, 3L, 3L, 1L, 2L, 1L, 3L, 2L, 3L, 3L, 1L, 1L, 2L, 2L, 2L, 
1L, 1L, 1L, 2L, 1L, 3L, 2L, 3L, 3L, 2L, 3L, 3L, 1L, 1L, 2L, 2L, 
1L, 2L, 3L, 3L, 3L, 3L, 3L, 1L, 3L), .Dim = c(15L, 10L))

> M
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    2    2    1    1    3    2    2    1     3
 [2,]    3    2    1    3    3    1    2    3    1     3
 [3,]    1    2    3    2    3    1    2    2    2     1
 [4,]    2    3    1    2    2    2    3    1    2     1
 [5,]    1    1    3    3    3    1    2    2    2     2
 [6,]    3    3    2    3    3    1    2    1    1     2
 [7,]    3    1    2    2    2    1    3    3    1     1
 [8,]    2    1    2    2    3    1    3    3    1     2
 [9,]    2    1    2    2    3    3    3    1    2     3
[10,]    3    1    3    2    1    2    1    2    1     3
[11,]    3    2    2    1    1    1    2    1    3     3
[12,]    1    1    1    2    1    1    2    3    2     3
[13,]    1    1    3    2    1    3    1    2    3     3
[14,]    1    2    2    2    3    3    3    3    3     1
[15,]    2    2    1    2    2    3    3    3    2     3

编辑

由于检查了所有组合,因此当矩阵较大时,上述方法效率低下。 下面的方法是https://www.geeksforgeeks.org/maximum-size-sub-matrix-with-all-1s-in-a-binary-matrix/中所述算法的R实现,效率更高.

M <- unname(as.matrix(read.csv(file = "test2.csv")))
S <- matrix(0,nrow = nrow(M),ncol = ncol(M))
S[,1] <- M[,1]
for (i in 1:nrow(S)) {
  for (j in 2:ncol(S)) {
    if (M[i,j]==1) {
      if (i==1) {
        S[i,j] <- M[i,j]
      } else {
        S[i,j] <- min(c(S[i,j-1],S[i-1,j],S[i-1,j-1]))+1
      }
    }
  }
}

inds <- which(S == max(S),arr.ind = TRUE)
w <- seq(max(S))-1
res <- lapply(seq(nrow(inds)), function(k) M[inds[k,"row"]-w,inds[k,"col"]-w])

#2楼 票数:0 已采纳

我使用dplyr找到了这个问题的以下答案:

M1 <- M %>% data.frame %>% mutate(sumVar = rowSums(.)) %>% 
  arrange(desc(sumVar)) %>% dplyr::select(-sumVar)
M2 <- M1  %>% as.matrix %>% t %>% data.frame %>% 
  mutate(sumVar = rowSums(.)) %>% arrange(desc(sumVar)) %>% 
  dplyr::select(-sumVar) %>% as.matrix %>% t %>% data.frame %>% 
  arrange_all(funs(desc(.))) 
i <- 1
j <- 1
while(sum(M2[1:i,1:j]) == i*j){
  i <- i+1
  j <- j+1
  M3 <- M2[1:i-1,1:j-1]
}

这是@ThomasIsCoding 提出的玩具数据:

M <- structure(c(1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Dim = c(5L, 
                                                                           5L))

这是结果:

> M
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    0    1
[2,]    1    1    1    1    1
[3,]    1    1    1    1    1
[4,]    1    1    1    1    1
[5,]    0    1    1    1    1
> M1
  X1 X2 X3 X4 X5
1  1  1  1  1  1
2  1  1  1  1  1
3  1  1  1  1  1
4  1  1  1  0  1
5  0  1  1  1  1
> M2
  X1 X2 X3 X4 X5
1  1  1  1  1  1
2  1  1  1  1  1
3  1  1  1  1  1
4  1  1  1  1  0
5  1  1  1  0  1
> M3
  X1 X2 X3 X4
1  1  1  1  1
2  1  1  1  1
3  1  1  1  1
4  1  1  1  1

注意,应该增加一些函数来保存变量名并在使用arrange后找到它们!

  ask by Mohieddin Jafari translate from so

未解决问题?本站智能推荐:

2回复

通过对几个列值的条件子集矩阵(整数,数值)

我有一个很大的矩阵,需要根据列的值(纬度和经度)对它进行子集化。 这是我尝试过的示例代码: 即它没有用。 所以我也尝试了: 请帮忙。 提前致谢。
1回复

根据另一列的最大值(dplyr::group_by)有条件地过滤组的元素

我想查看重复的TOF值。 每当发现重复值(换句话说,属于同一 dplyr::group 的TOF值)时,我想保留那些满足以下条件的值: 此外,在每个TOF组中,只应保留具有最高intFT前三个元素。 NA值不应该被删除。 这将返回一个不正确的解决方案:
1回复

按元素子集矩阵并将值保留为矩阵

我需要将一个矩阵子集并将结果保留为矩阵,即我想在2个不同的矩阵中将值在2到8之间的所有列进行子集化,然后通过结果对第三个矩阵进行子集化。 前两个矩阵是纬度和经度值。 我这样尝试过: 我尝试的另一个选择是 这是所有单元格编号的子集,但是我希望它保留为行或列的网格或矩阵,因为它返回了线性
1回复

跨不同行和列的多个矩阵元素

我试图在 R 中的矩阵或数据帧中跨列提取特定的行元素。一个简化的例子是: 我希望在 dat 的列中返回 rown 指定的行索引。 我可以用一个循环来做到这一点: 但我知道必须有一种方法可以通过 apply 或类似的方法来做到这一点。 但是,我无法弄清楚如何将 rown 的元素合并到 apply 函数
1回复

如果列都相等,则R删除组

只有当所有 x OR y 值都相同时,我才想删除一个组(“集群”)。 样本数据: 所以对于这个 DF,只有第 2 组会被删除,因为所有的 y 值都是相同的。 编辑:添加了另一个示例数据集因此该解决方案适用于大多数 DF,但不知何故,组/集群 12 不会被删除,即使 Y 值都相同..
1回复

找到连接矩阵的最大独立子集

我有两个由连接矩阵链接的组,如下所示: 因此X1链接到V1和V2,而V2链接到X1,X2和X3,依此类推。 我需要找到一种方法(算法或命令)来获取矩阵的所有最大的独立子集。 所以,在这种情况下: 和: 和: 你有什么提示吗? 我想已经有一些库或函数可以用于图形分析或线性代数
2回复

使用位于最大值附近的最小值的子集

情况:我有一个由不同记录器收集的数据集列表,如下所示: 任务:我只想保留在max(OriginalTraitValue)之前和之后至少有两个记录的Temp值的数据集。 我希望这个情节可以使它更清晰。 红色=最大值,绿色=保留数据集所需的值。 题 我如何在R中执行此操作,例如
2回复

筛选出所有值均等于1的列

我有一个巨大的数据框。 我想过滤所有其值均等于1的列。 这是我的数据示例。 所需的输出如下: 我想使用dplyr或其他R函数中的过滤器函数。 你知道我该怎么做吗? 谢谢