将矩阵的列与其列相乘

Multiply a matrix' columns by its columns

我有一个 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,]
}

但我认为我需要更多索引,因为这只会让我在每个参数中留下一个数字..

首先,您对数据的要求不明确。其次,您是尝试将每个值乘以自身,还是进行矩阵乘法

我们创建一个 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 向量与其自身的矩阵乘积。

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

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

至于为什么你的不起作用,我们可以试验一下,看看我们确实得到了一个数字而不是一个矩阵。原因是当您对矩阵的单个行或列进行子集化时,维度为 "dropped" 并且它被强制转换为纯向量。当您对两个向量进行矩阵乘法时,您会得到它们的点积。

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