Создать большую матрицу из меньшей - PullRequest
3 голосов
/ 16 октября 2010

У меня есть матрица А, которая:

A <- matrix(c(1:15), byrow=T, nrow=5)
A
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12
[5,]   13   14   15

Теперь я хочу создать матрицу B размером 8x8 (или 10x10, или 15x15 и т. Д.), Которая будет выглядеть следующим образом:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    0    0    0    0    0
[2,]    4    5    6    0    0    0    0    0
[3,]    7    8    9    0    0    0    0    0
[4,]   10   11   12    0    0    0    0    0
[5,]   13   14   15    0    0    0    0    0
[6,]    0    0    0    0    0    0    0    0
[7,]    0    0    0    0    0    0    0    0
[8,]    0    0    0    0    0    0    0    0

Итак, начиная с A, я хочу добавить столбцы и строки в размеры 8x8, все они заменяются нулевыми значениями ... Любая идея? Заранее спасибо !!

Ответы [ 3 ]

6 голосов
/ 16 октября 2010

Другой способ - сначала создать большую матрицу, а затем вставить в нее маленькую матрицу, как в этой функции:

    expandR = function(m,nrows,ncols,with=0){
      p=matrix(with,nrows,ncols)
      p[1:nrow(m),1:ncol(m)]=m
      p
    }

Не уверен, что лучше (быстрее, чище и т. Д.).Мои ошибки, если вы попытаетесь расширить их до размера, меньшего, чем оригинал.

3 голосов
/ 16 октября 2010

Попробуйте, предполагая, что A имеет хотя бы одну строку и один столбец:

B <- matrix(0, 8, 8)
B[1:nrow(A), 1:ncol(A)] <- A

или как один оператор:

B <- "[<-"(matrix(0, 8, 8), 1:nrow(A), 1:ncol(A), value = A)

Если A может иметь ноль строкили нулевые столбцы, затем используйте seq_len(nrow(A)) и seq_len(ncol(A)) вместо 1:nrow(A) и 1:ncol(A).

Альтернативно, это работает даже в случае, если A имеет нулевые строки или столбцы:

B <- matrix(0, 8, 8)
B[cbind(c(row(A)), c(col(A)))] <- A

или

B <- "[<-"(matrix(0, 8, 8), cbind(c(row(A)), c(col(A))), value = A)

или

B <- replace(matrix(0, 8, 8), cbind(c(row(A)), c(col(A))), A)
1 голос
/ 16 октября 2010

Как насчет:

A <- matrix(c(1:15), byrow=T, nrow=5)

expandMatrix <- function(X, nrow, ncol) {
    X <- cbind(X, matrix(0, nrow = nrow(X), ncol = ncol - ncol(X)))
    X <- rbind(X, matrix(0, nrow = nrow - nrow(X), ncol = ncol(X)))
    X
}

Тогда

> expandMatrix(A, 8, 8)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    0    0    0    0    0
[2,]    4    5    6    0    0    0    0    0
[3,]    7    8    9    0    0    0    0    0
[4,]   10   11   12    0    0    0    0    0
[5,]   13   14   15    0    0    0    0    0
[6,]    0    0    0    0    0    0    0    0
[7,]    0    0    0    0    0    0    0    0
[8,]    0    0    0    0    0    0    0    0

или

> expandMatrix(A, 10, 10)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    2    3    0    0    0    0    0    0     0
 [2,]    4    5    6    0    0    0    0    0    0     0
 [3,]    7    8    9    0    0    0    0    0    0     0
 [4,]   10   11   12    0    0    0    0    0    0     0
 [5,]   13   14   15    0    0    0    0    0    0     0
 [6,]    0    0    0    0    0    0    0    0    0     0
 [7,]    0    0    0    0    0    0    0    0    0     0
 [8,]    0    0    0    0    0    0    0    0    0     0
 [9,]    0    0    0    0    0    0    0    0    0     0
[10,]    0    0    0    0    0    0    0    0    0     0

Также может быть задано значение по умолчанию, если вы в основном хотите использовать квадратную матрицу в качестве выходных данных:

expandMatrix <- function(X, nrow, ncol = nrow) {
    X <- cbind(X, matrix(0, nrow = nrow(X), ncol = ncol - ncol(X)))
    X <- rbind(X, matrix(0, nrow = nrow - nrow(X), ncol = ncol(X)))
    X
}

Тогда expandMatrix(A, 8) будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...