0

我有以下矩阵:

      [,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 维度。

4

4 回答 4

0

类似于 JDLs answer,但直接为您提供子矩阵尺寸:

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
于 2016-10-24T11:00:39.073 回答
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

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

于 2016-10-24T11:00:19.283 回答
0

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

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

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

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

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

于 2016-10-24T10:03:53.027 回答
0

你可以试试:

apply(which(matrix==1, arr.ind = T), 2, function(x) length(unique(x)))
row col 
  7   4 
于 2016-10-24T10:07:56.650 回答