给定两个相同维度的数字矩阵A
和B
。什么是元素划分的最佳方式:A[i,j] / B[i,j]
?我知道可以使用双for
循环。但我想要最有效的方式。
修改:如果有B[i,j] == 0
,则必须为A[i,j] <- 0
。
答案 0 :(得分:7)
如果您的矩阵是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
。