从较小的矩阵创建一个更大的矩阵

3

我有一个矩阵A,它是:

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
另一种方法是先创建较大的矩阵,然后将小矩阵插入其中,就像这个函数中所示:
    expandR = function(m,nrows,ncols,with=0){
      p=matrix(with,nrows,ncols)
      p[1:nrow(m),1:ncol(m)]=m
      p
    }

不确定哪种更好(更快、更干净等)。如果尝试将大小缩小到原始大小以下,则会导致我的错误。


3
是的,你的函数更快。例如,从矩阵B开始,它是5x9的,使用全零的4096x4096矩阵计算时间为0.11秒,而第一个函数为0.53秒。非常感谢你! - Tommaso

5

假设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)

我认为这是实现我所需的最佳方式。我在我的函数中使用了你的建议。因此,我在我的新文章中引用了你的建议:http://statistic-on-air.blogspot.com/2010/10/fast-matrix-multiplication-in-r.html 非常感谢! - Tommaso

1

这样怎么样:

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)就足够了。


这正是我一直在寻找的!!非常感谢您的快速回答! - Tommaso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接