首页 文章

将矩阵的列乘以其列

提问于
浏览
0

我有一个4x100矩阵,我想在其转置等中将第1列与第1行相乘,并将这些矩阵存储在某处,以便能够获取这些新矩阵的总和 .

我真的不知道从哪里开始,因为我在列 - 行 - 乘法后获得了4x4矩阵 . 由于这个事实,我无法将它们存储在矩阵中

数据:

mm num[1:4,1:100]

mm_t num[1:100,1:4]

我正在考虑以某种方式创建一个列表

list1=list()
for(i in 1:100){
    list1[i] <- mm[,i]%*%mm_t[i,]
}

但我觉得我需要更多的指数,因为这只会让我在每个参数中留下一个数字 .

2 回答

  • 1

    让我们从一些示例数据开始 . 请养成在你的问题中包含这样的事情的习惯:

    nr = 4
    nc = 100
    set.seed(47)
    mm = matrix(runif(nr * nc), nrow = nr)
    

    这是一个有效的答案,与您的尝试非常相似:

    result = list()
    for (i in 1:ncol(mm)) result[[i]] = mm[, i] %*% t(mm[, i])
    result[1:2]
    # [[1]]
    #           [,1]      [,2]      [,3]      [,4]
    # [1,] 0.9544547 0.3653018 0.7439585 0.8035430
    # [2,] 0.3653018 0.1398132 0.2847378 0.3075428
    # [3,] 0.7439585 0.2847378 0.5798853 0.6263290
    # [4,] 0.8035430 0.3075428 0.6263290 0.6764924
    # 
    # [[2]]
    #           [,1]      [,2]      [,3]      [,4]
    # [1,] 0.3289532 0.3965557 0.2231443 0.2689613
    # [2,] 0.3965557 0.4780511 0.2690022 0.3242351
    # [3,] 0.2231443 0.2690022 0.1513691 0.1824490
    # [4,] 0.2689613 0.3242351 0.1824490 0.2199103
    

    至于为什么你的工作不起作用,我们可以试验看看确实我们得到的是数字而不是矩阵 . 原因是当您对矩阵的单个行或列进行子集化时,维度将被“删除”并且它将被强制转换为普通向量 . 当你矩阵乘以两个向量时,你得到它们的点积 .

    mmt = t(mm)
    mm[, 1] %*% mmt[1, ]
    #          [,1]
    # [1,] 2.350646
    dim(mm[, 1])
    # NULL
    dim(mmt[1, ])
    # NULL
    

    我们可以通过在子集代码中指定 drop = FALSE 来避免这种情况

    dim(mmt[1, , drop = FALSE])
    # [1] 1 4
    

    因此稍微修改您的尝试,只需添加 drop = FALSE 将使其工作 .

    res2 = list()
    for (i in 1:ncol(mm)) res2[[i]] = mm[, i] %*% mmt[i, , drop = FALSE]
    identical(result, res2)
    # [1] TRUE
    
  • 0

    首先,您的数据调用尚不清楚 . 其次,您是尝试将每个值相乘,还是进行矩阵乘法

    我们创建了一个4x100矩阵及其转置:

    mm <- matrix(1:400, nrow = 4, ncol = 100)
    mm.t <- t(mm)
    

    然后我们可以进行矩阵乘法(这就是你所做的,你从矩阵乘法的定义得到一个4 x 4矩阵https://www.wikiwand.com/en/Matrix_multiplication

    如果我们想要将每个索引乘以它自己(因此mm [1,1]乘以mm [1,1]),那么:

    mm * mm
    

    这将产生4x100矩阵,其中每个值是原始值的平方 .

    如果我们想要每列的矩阵乘法,那么:

    sapply(1:100, function(x) {
      mm[, x] %*% mm[, x]
    })
    

    这导致100个值:每个值是4x1向量与其自身的矩阵乘积 .

相关问题