簡體   English   中英

將列和行添加到R中的矩陣

[英]Adding columns and rows to a matrix in R

所以我想用兩個矩陣做矩陣點積,即使它們的大小不同。 問題是,如何將全0的行和列附加到較小的矩陣,以使其與較大的矩陣具有相同的大小。

因此,例如,如果我有一個2x2矩陣和一個4x4矩陣,我想看看R中是否有一種方法可以對2行和2列全為0的相加進行編碼。 有人可以幫忙嗎?

假設您從兩個矩陣m1m2 ,其中更大的是m1

m1 <- matrix(1, 4, 4)
m2 <- matrix(1, 2, 2)

您可以創建第三個零矩陣,其尺寸與較大的矩陣相同,然后填寫較小的矩陣值。

m3 <- matrix(0, dim(m1)[1], dim(m1)[2])
m3[1:nrow(m2), 1:ncol(m2)] <- m2
m3
#      [,1] [,2] [,3] [,4]
# [1,]    1    1    0    0
# [2,]    1    1    0    0
# [3,]    0    0    0    0
# [4,]    0    0    0    0

這是一個可能的函數,可用於基於一組給定的尺寸來制作方矩陣。

sameDim <- function(x, size, fill = 0L) {
    rb <- rbind(x, matrix(fill, size[1]-nrow(x), ncol(x)))
    cbind(rb, matrix(fill, nrow(rb), size[2]-ncol(x)))
}
sameDim(m2, dim(m1))
#      [,1] [,2] [,3] [,4]
# [1,]    1    1    0    0
# [2,]    1    1    0    0
# [3,]    0    0    0    0
# [4,]    0    0    0    0

可能不是最優雅的方式,但是我已經完成了類似的任務,只是先水平然后垂直添加填充矩陣,以完成不足的部分以使它們可變形。 這是一個函數以及一個示例:

set.seed(1)
a <- matrix(rnorm(8), nrow=2, ncol=4)
b <- matrix(rnorm(10), nrow=5, ncol=2)

#> a
#           [,1]       [,2]       [,3]      [,4]
#[1,] -0.6264538 -0.8356286  0.3295078 0.4874291
#[2,]  0.1836433  1.5952808 -0.8204684 0.7383247
#> b
#           [,1]        [,2]
#[1,]  0.5757814 -2.21469989
#[2,] -0.3053884  1.12493092
#[3,]  1.5117812 -0.04493361
#[4,]  0.3898432 -0.01619026
#[5,] -0.6212406  0.94383621

# Here is a function that adds empty rows and columns of 0s to matrices x and y to make them comformable
# Two matrices x and y, and repeated fill element which is by default 0s
filler <- function(x, y, fill = 0){
    # Block of x to add horizontally before vertical block
    horizontal.x = matrix(fill,
        ncol=ifelse(ncol(x) > ncol(y), 0, ncol(y) - ncol(x)),
        nrow=nrow(x)
    )
    # Block of y to add horizontally before vertical block
    horizontal.y = matrix(fill,
        ncol=ifelse(ncol(x) > ncol(y), ncol(x) - ncol(y), 0),
        nrow=nrow(y)
    )
    # Vertical block of x to add after the horizontal block
    vertical.x = matrix(fill,
        ncol=ncol(x) + ncol(horizontal.x),
        nrow=ifelse(nrow(x) > nrow(y), 0, nrow(y) - nrow(x))
    )
    # Vertical block of y to add after the horizontal block
    vertical.y = matrix(fill,
        ncol=ncol(y) + ncol(horizontal.y),
        nrow=ifelse(nrow(x) > nrow(y), nrow(x) - nrow(y), 0)
    )
    # Bind the blocks together and return both within a list
    x <- rbind(cbind(x, horizontal.x), vertical.x)
    y <- rbind(cbind(y, horizontal.y), vertical.y)
    list(x, y)
}

filler(a, b)
filler(b, a)
filler(b, t(a))

#> filler(a, b)
#[[1]]
#           [,1]       [,2]       [,3]      [,4]
#[1,] -0.6264538 -0.8356286  0.3295078 0.4874291
#[2,]  0.1836433  1.5952808 -0.8204684 0.7383247
#[3,]  0.0000000  0.0000000  0.0000000 0.0000000
#[4,]  0.0000000  0.0000000  0.0000000 0.0000000
#[5,]  0.0000000  0.0000000  0.0000000 0.0000000
#
#[[2]]
#           [,1]        [,2] [,3] [,4]
#[1,]  0.5757814 -2.21469989    0    0
#[2,] -0.3053884  1.12493092    0    0
#[3,]  1.5117812 -0.04493361    0    0
#[4,]  0.3898432 -0.01619026    0    0
#[5,] -0.6212406  0.94383621    0    0
#
#> filler(b, a)
#[[1]]
#           [,1]        [,2] [,3] [,4]
#[1,]  0.5757814 -2.21469989    0    0
#[2,] -0.3053884  1.12493092    0    0
#[3,]  1.5117812 -0.04493361    0    0
#[4,]  0.3898432 -0.01619026    0    0
#[5,] -0.6212406  0.94383621    0    0
#
#[[2]]
#           [,1]       [,2]       [,3]      [,4]
#[1,] -0.6264538 -0.8356286  0.3295078 0.4874291
#[2,]  0.1836433  1.5952808 -0.8204684 0.7383247
#[3,]  0.0000000  0.0000000  0.0000000 0.0000000
#[4,]  0.0000000  0.0000000  0.0000000 0.0000000
#[5,]  0.0000000  0.0000000  0.0000000 0.0000000
#
#> filler(b, t(a))
#[[1]]
#           [,1]        [,2]
#[1,]  0.5757814 -2.21469989
#[2,] -0.3053884  1.12493092
#[3,]  1.5117812 -0.04493361
#[4,]  0.3898432 -0.01619026
#[5,] -0.6212406  0.94383621
#
#[[2]]
#           [,1]       [,2]
#[1,] -0.6264538  0.1836433
#[2,] -0.8356286  1.5952808
#[3,]  0.3295078 -0.8204684
#[4,]  0.4874291  0.7383247
#[5,]  0.0000000  0.0000000


ex <- filler(b, t(a))
# This is now defined
ex[[1]] %*% t(ex[[2]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM