我有一个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,]
}
但是我想要一些更多的索引,因为这只会让我在每个参数中留下一个数字。
答案 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