如何使用R从较大的矩阵中提取子矩阵的维数?

时间:2016-10-24 09:41:09

标签: r matrix dimensions submatrix

我有以下矩阵:

beans {
    dataSource(BasicDataSource) {
        **url = "jdbc:mysql://127.0.0.1/db_name"**
        driverClassName = "com.mysql.jdbc.Driver"
        username = "root"
        password = "root"
        pooled = true
   }
}

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

4 个答案:

答案 0 :(得分:0)

您实际上在问“有多少行和列有一个”?使用apply

可以轻松回答这些问题
apply(M,1,any)
apply(M,2,any)

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

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

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

答案 1 :(得分:0)

您可以尝试:

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

答案 2 :(得分:0)

您可以强制使用稀疏矩阵并提取索引槽:

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

#column dim:
diff(range(m@j)) + 1L
#[1] 4

我希望这样做非常有效,无论如何将矩阵存储/处理为稀疏矩阵可能很有用。

答案 3 :(得分:0)

与JDLs类似,但直接为您提供子矩阵维度:

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