【问题标题】:Multiply a matrix' columns by its columns将矩阵的列乘以其列
【发布时间】:2017-03-31 09:00:02
【问题描述】:

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

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

【问题讨论】:

  • 请使用有效的 R 语法共享您的数据。
  • 数据是以前的函数和 for 循环的结果,但我认为如果我复制整个代码会太混乱,因为它是我正在使用的统计项目,并不是真的与这个代码问题有关,所以我只是给你留下了我的数据输出,来自 R 中的环境,说明我的数据是什么样的
  • 我已经编辑了我的问题,因为我认为之前的问题并不清楚。我想将 mm 矩阵(4x1 向量)中的第 1 列与其转置 mm_t(1x4 向量)中的第 1 行相乘,这应该给我留下 100 个 4x4 矩阵
  • 想一想,如果您分享了一个带有样本输入和所需输出的小示例,它怎么可能从一开始就很清楚(并且仍然比现在更清楚)。

标签: r matrix vector matrix-multiplication


【解决方案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

【讨论】:

  • 太好了,谢谢!我不知道当您对矩阵的行/列进行子集化时维度会被删除,但这些信息将来会派上用场
【解决方案2】:

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

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

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

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

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

mm * mm

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

如果我们想要每列与自身的矩阵相乘,那么:

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

这会产生 100 个值:每个值都是 4x1 向量与其自身的矩阵乘积。

【讨论】:

  • 我对数据的调用在另一个块中,因此 mm 和 mm_t 取自 R 中的环境,只是为了让您了解我正在使用的内容。恐怕你的 sapply 功能不会让我得到我想要的东西。 sapply 只给了我 100 个值,而不是 100 个 4x4 矩阵,如果我想将一个来自 mm 的 4x1 向量和一个来自其转置 mm_t 的 1x4 向量相乘,这应该是输出
  • 我已经编辑了我的问题,因为我认为之前的问题并不清楚。我想将 mm 矩阵(4x1 向量)中的第 1 列与其转置 mm_t(1x4 向量)中的第 1 行相乘,这应该给我留下 100 个 4x4 矩阵
猜你喜欢
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2017-04-04
  • 2019-03-29
  • 1970-01-01
  • 2015-05-20
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多