【问题标题】:How to extract dimension of a submatrix from a bigger matrix using R?如何使用 R 从更大的矩阵中提取子矩阵的维度?
【发布时间】:2017-03-06 00:58:43
【问题描述】:

我有以下矩阵:

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    0    0    0    0    0    0    0    0     0
 [2,]    0    0    0    0    0    0    0    0    0     0
 [3,]    0    0    0    0    0    0    0    0    0     0
 [4,]    1    1    1    1    0    0    0    0    0     0
 [5,]    1    1    1    1    0    0    0    0    0     0
 [6,]    1    1    1    1    0    0    0    0    0     0
 [7,]    1    1    1    1    0    0    0    0    0     0
 [8,]    1    1    1    1    0    0    0    0    0     0
 [9,]    1    1    1    1    0    0    0    0    0     0
[10,]    1    1    1    1    0    0    0    0    0     0

我想知道如何提取元素等于 1 的子矩阵的 7x4 维度。

【问题讨论】:

    标签: r matrix dimensions submatrix


    【解决方案1】:

    类似于 JDL 的答案,但直接为您提供子矩阵维度:

    mat <- structure(c(
    0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
    ), .Dim = c(10L, 10L), .Dimnames = list(NULL, NULL))
    
    dim(mat[apply(mat, 1, any), apply(mat, 2, any)])
    #[1] 7 4
    

    这将删除仅包含零的行和列。如果您想保留至少包含一个1 的行和列,您可以这样做:

    mat[3, 5] <- 2 #just to complicate it a little
    
    f <- function(x) any(x==1) #create a simple function
    
    dim(mat[apply(mat, 1, f), apply(mat, 2, f)])
    #[1] 7 4
    

    【讨论】:

      【解决方案2】:

      您实际上是在问“有多少行和列中有一个”?使用apply 最容易回答这些问题:

      apply(M,1,any)
      apply(M,2,any)
      

      将分别告诉您包含非零值的行数和列数。

      如果测试非零值不是您的问题,请将any 替换为一个函数,该函数将为所需的行返回TRUE,否则为FALSE

      如果您不能保证它们形成子矩阵(即它们不是矩形),那么您将需要做更多的工作。

      【讨论】:

        【解决方案3】:

        你可以试试:

        apply(which(matrix==1, arr.ind = T), 2, function(x) length(unique(x)))
        row col 
          7   4 
        

        【讨论】:

          【解决方案4】:

          您可以强制转换为稀疏矩阵并提取索引槽:

          library(Matrix)
          m <- as(M, "TsparseMatrix")
          #row dim:
          diff(range(m@i)) + 1L
          #[[1] 7
          
          #column dim:
          diff(range(m@j)) + 1L
          #[1] 4
          

          我希望这会非常有效,并且无论如何将矩阵存储/视为稀疏矩阵可能会很有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-14
            • 1970-01-01
            • 1970-01-01
            • 2018-05-12
            相关资源
            最近更新 更多