将矩阵的列乘以其列

时间:2016-11-16 23:50:14

标签: r matrix vector matrix-multiplication

我有一个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 个答案:

答案 0 :(得分:1)

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

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

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

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

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

mm * mm

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

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

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

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

答案 1 :(得分:0)

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

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

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

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