簡體   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