【问题标题】:Create a bigger matrix from smaller one从较小的矩阵创建更大的矩阵
【发布时间】:2010-10-16 10:25:01
【问题描述】:

我有一个矩阵 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 维度,全部替换为零值... 任何的想法? 提前谢谢你!

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    另一种方法是先创建较大的矩阵,然后将较小的矩阵插入,如以下函数所示:

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

    不确定哪个更好(更快、更清洁等)。如果您尝试扩展为比原始尺寸更小的尺寸,则会出错。

    【讨论】:

    • 是的,你的速度更快。例如,从 5x9 的矩阵 B 开始,4096x4096 零矩阵的计算时间对于您的函数是 0.11,对于第一个函数是 0.53。所以谢谢你!
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

    怎么样:

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

    【讨论】:

    • 这正是我想要的!非常感谢您的快速答复!
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多