繁体   English   中英

R 中的矩阵运算无法按预期工作

[英]Sweep in matrix operations in R not working as intended

我目前正在尝试有效地实现一个新的方阵 M,它是两个具有相同维度的方阵WV的函数,如下所示: F ij = W ii ·V ji ,Fi行是WVii对角元素。

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

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

将取消意味着的列(第二维度) attitude基质(从帮助中获取)。 此外,可以提供一个函数,如FUN="*" 在这种情况下, attitude矩阵的列将乘以它们各自的中位数。

所以产生矩阵F的预期代码是

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

显然,由于 R 的长处是矢量化,这可以通过扫描操作来完成:我想将V的列( FUN="*" )乘以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

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

如果有人澄清F ij 的哪些实现是错误的,我将非常感激!

您只忘记转置矩阵之一,两种实现都是有效的:

identical(Fij, t(Fij2))
# [1] TRUE

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM