如何使用 R 从更大的矩阵中提取子矩阵的维数?
How to extract dimension of a submatrix from a bigger matrix using R?
我有以下矩阵:
[,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 维度。
你实际上是在问 "how many rows and columns have a one in them"?使用 apply
:
最容易回答这些问题
apply(M,1,any)
apply(M,2,any)
将分别告诉您包含非零值的行数和列数。
如果非零性测试不是您的真正问题,请将 any
替换为一个函数,该函数将 return TRUE
用于所需的行并且 FALSE
否则。
如果你不能保证它们形成子矩阵(即它们不是矩形)那么你需要做更多的工作。
你可以试试:
apply(which(matrix==1, arr.ind = T), 2, function(x) length(unique(x)))
row col
7 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
我希望这会非常有效,并且它可能对store/treat您的矩阵作为稀疏矩阵很有用。
类似于 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
我有以下矩阵:
[,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 维度。
你实际上是在问 "how many rows and columns have a one in them"?使用 apply
:
apply(M,1,any)
apply(M,2,any)
将分别告诉您包含非零值的行数和列数。
如果非零性测试不是您的真正问题,请将 any
替换为一个函数,该函数将 return TRUE
用于所需的行并且 FALSE
否则。
如果你不能保证它们形成子矩阵(即它们不是矩形)那么你需要做更多的工作。
你可以试试:
apply(which(matrix==1, arr.ind = T), 2, function(x) length(unique(x)))
row col
7 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
我希望这会非常有效,并且它可能对store/treat您的矩阵作为稀疏矩阵很有用。
类似于 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