【发布时间】:2018-07-31 04:29:14
【问题描述】:
我目前正在尝试有效地实现一个新的方阵 M,它是两个相同维度的方阵 W 和 V 的函数,如下所示: Fij = Wii·Vji。即F的ith行是ith的对角元素W 乘以 V 的 ith 列。
R 中有一个函数sweep,它允许在数组的边缘扫描统计数据。即,做
mean.att <- apply(attitude, 2, mean)
sweep(data.matrix(attitude), 2, mean.att)
将对attitude 矩阵(取自帮助)的列(第 2nd 维)进行贬义。此外,还可以提供一个函数,例如FUN="*"。在这种情况下,attitude 矩阵的列将乘以各自的中位数。
所以生成矩阵 F 的预期代码是
Fij <- matrix(NA, ncol=N, nrow=N)
for (i in 1:N) {
Fij[i, ] <- w[i, i] * v[, i]
}
显然,由于 R 的长处是矢量化,这可以通过 sweep 操作来完成:我想将 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
对角元素相等,但非对角元素不相等。
如果有人澄清 Fij 的哪些实现是错误的,我将不胜感激!
【问题讨论】:
标签: arrays r matrix vectorization matrix-multiplication