【发布时间】:2016-09-15 20:34:00
【问题描述】:
给定两个相同维度的数字矩阵A 和B。元素划分的最佳方法是什么:A[i,j] / B[i,j]?我知道可以使用双 for 循环。但我想要最有效的方法。
编辑:如果有B[i,j] == 0,则必须是A[i,j] <- 0。
【问题讨论】:
标签: r performance matrix
给定两个相同维度的数字矩阵A 和B。元素划分的最佳方法是什么:A[i,j] / B[i,j]?我知道可以使用双 for 循环。但我想要最有效的方法。
编辑:如果有B[i,j] == 0,则必须是A[i,j] <- 0。
【问题讨论】:
标签: r performance matrix
如果您的矩阵是A 和B,您可以只使用A / B。
A <- matrix(1:4, 2, 2)
# [,1] [,2]
#[1,] 1 3
#[2,] 2 4
B <- matrix((1:4) * 2, 2, 2)
# [,1] [,2]
#[1,] 2 6
#[2,] 4 8
C <- A / B
# [,1] [,2]
#[1,] 0.5 0.5
#[2,] 0.5 0.5
当有
B[i,j] == 0时,它必须是A[i,j] <- 0。
如果 B 中有 0 个元素,则可能会得到 NaN、Inf 或 -Inf,具体取决于 A 中的对应项。
0 / 0
# NA
1 / 0
# Inf
-1 / 0
# -Inf
所有这些都不是有限的。如果您想用 0 替换它们,只需执行以下操作:
C <- A / B
C[!is.finite(C)] <- 0
很难记住 R 如何处理 NA、NaN、Inf 和 -Inf。您可以阅读?is.finite 和?NA 了解一般信息。这里我做一个简单的测试。
x <- c(NA, NaN, Inf, -Inf)
is.finite(x)
# [1] FALSE FALSE FALSE FALSE
is.infinite(x)
# [1] FALSE FALSE TRUE TRUE
is.na(x)
# [1] TRUE TRUE FALSE FALSE
is.nan(x)
# [1] FALSE TRUE FALSE FALSE
注意,is.infinite 不是is.finite 的倒数,而是is.na 的倒数。这就是我使用!is.finite的原因。
【讨论】: