2016-10-24 3 views
0

У меня есть следующая матрица:Как извлечь размер подматрицы из более крупной матрицы, используя 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 

, и я хотел бы знать, как извлечь размерность 7x4 подматрицы с элементами, равными 1.

ответ

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 
0

Вы эффективно спрашивать «, сколько строк и столбцов есть один в них "? Эти вопросы отвечают самому простому использование apply:

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

покажет вам количество строк и столбцов, соответственно, которые содержат ничего, отличное от нуля.

Если тестирование на ненулевое значение не является вашей проблемой, замените any на функцию, которая вернет TRUE для нужных строк и FALSE в противном случае.

Если вы не можете гарантировать, что они образуют подматрицу (т. Е. Они не имеют прямоугольной формы), вам нужно будет сделать еще больше работы, чем это.

0

Вы можете попробовать:

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

Вы могли принуждать к разреженной матрицей и извлечь индексы слотов:

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

#column dim: 
diff(range([email protected])) + 1L 
#[1] 4 

я ожидаю, что это будет весьма эффективным, и это может быть полезно для хранения/В любом случае, обработайте вашу матрицу как разреженную матрицу.