arrays - R 中的矩阵运算扫描未按预期工作

标签 arrays r matrix vectorization matrix-multiplication

我目前正在尝试有效地实现一个新的方阵 M,作为两个相同维度的方阵 WV 的函数,如下所示: Fij = Wii·Vji。即,F 的第 ith 行是W 乘以 Vith 列。

R 中有一个函数,sweep,它允许在数组的边距上扫描统计数据。即,做

mean.att <- apply(attitude, 2, mean)
sweep(data.matrix(attitude), 2, mean.att)

将对态度矩阵的列(第二个维度)进行去意义(取自帮助)。此外,还可以提供一个函数,例如 FUN="*"。在这种情况下,态度矩阵的列将乘以各自的中位数。

因此生成矩阵 F 的预期代码是

Fij <- matrix(NA, ncol=N, nrow=N)
for (i in 1:N) {
  Fij[i, ] <- w[i, i] * v[, i]
}

显然,由于 R 的强项是矢量化,这可以通过扫描操作来完成:我想将以下列 (FUN="*") 相乘V除以W的对角线,即

Fij2 <- sweep(v, 2, diag(w), FUN="*")

但是,每当我检查 Fij==Fij2 时,它们都不是!

MWE:

set.seed(1)
w <- matrix(rnorm(16), nrow=4)
v <- matrix(rnorm(16), nrow=4)
Fij <- matrix(NA, ncol=4, nrow=4)
for (i in 1:4) { # This loop can and should be vectorised
  Fij[i, ] <- w[i, i] * v[, i]
}
Fij2 <- sweep(v, 2, diag(w), FUN="*")
Fij
Fij2

对角线元素相等,但非对角线元素不相等。

如果有人澄清 Fij 的哪些实现是错误的,我将不胜感激!

最佳答案

使用扫描的实现给出了转置结果。如果您使用更简单的输入矩阵,您可以很容易地看到这一点:

w <- matrix(1:4, nrow = 2)
v <- matrix(5:8, nrow = 2)
Fij <- matrix(NA, ncol=2, nrow=2)
for (i in 1:2) {
  Fij[i, ] <- w[i, i] * v[, i]
}
Fij2 <- sweep(v, 2, diag(w), FUN="*")
Fij
#>      [,1] [,2]
#> [1,]    5    6
#> [2,]   28   32
Fij2
#>      [,1] [,2]
#> [1,]    5   28
#> [2,]    6   32
t(Fij2)
#>      [,1] [,2]
#> [1,]    5    6
#> [2,]   28   32

因此,Fij 与您的描述相符,t(Fij2) 也是如此。

关于arrays - R 中的矩阵运算扫描未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48891558/

相关文章:

r - R View()不会显示数据框的所有列

r - 子组的新列和另一列中的百分比范围

java - 简单的 PixelGrid,我可以用鼠标绘制大像素(选择分辨率)?

javascript - 如何合并数组中的重复条目

c++ - 如何删除数组 C++?

r - 如何根据时间有条件地连接来自 2 个数据集的数据?

algorithm - 如何解决达到矩阵问题结束所需的最少步骤?

r - 将矩阵拆分为子矩阵

javascript - .map 使用 Mongoose 获取数据后返回空对象数组

c++ - 循环 typedef 列表