2015-01-18 2 views
3

Я нашел решение аналогичного вопроса, который разбивает матрицу на набор неперекрывающихся подматриц, когда матрица может быть не квадратной (как это может быть не в моей ситуации) Function to split a matrix into sub-matrices in R. Однако в моем случае я хочу, чтобы матрицы были перекрывающимися. Используя следующую матрицу в качестве примера:Сплит-матрица в подматрицы

M <- matrix(1:20, 5) 

#  [,1] [,2] [,3] [,4] 
#[1,] 1 6 11 16 
#[2,] 2 7 12 17 
#[3,] 3 8 13 18 
#[4,] 4 9 14 19 
#[5,] 5 10 15 20 

Если выбрать количество строк и столбцов подматрицы быть 4 и 4, соответственно, затем суб-матрицы должны быть возвращены все возможные перекрытия 4X4 суб матрица, полностью вписывается в границу исходной матрицы (это другое место, где ответ на этот вопрос, возможно, должен отличаться от вопроса, на который я ссылался). В моем примере должны быть только две подматрицы, которые должны быть возвращены. M[1:4,1:4] и M[2:5,1:4]. Я должен иметь возможность выбирать любой произвольный размер подматрицы. Кажется, я не могу найти примеры извлечения перекрывающихся подматриц, но я могу передумать это. Есть ли у кого-нибудь идеи по наилучшему пути?

ответ

4

Возможно, стратегия, как это может работать

submat <- function(m, nrow, ncol) { 
    stopifnot(nrow(m)>=nrow, ncol(m)>=ncol) 
    rowstarts<-1:(nrow(m)-nrow+1) 
    colstarts<-1:(ncol(m)-ncol+1) 
    ss <- function(r, c) { 
     m[r:(r+nrow-1), c:(c+ncol-1), drop=FALSE] 
    } 
    with(expand.grid(r=rowstarts, c=colstarts), mapply(ss, r, c, SIMPLIFY=FALSE)) 
} 

submat(M, 4, 4) 

мы определяем где возможные начальные индексы для строк и столбцов, то мы используем expand.grid(), чтобы генерировать все возможные комбинации таких исходных значений, то мы используем mapply чтобы извлечь все возможные подматрицы с этими начальными позициями.

+0

Отличный ответ! Мне нужно бросить забыть о expand.grid. – Beaker

Смежные вопросы