2016-09-15 95 views
-1

给定两个相同维数的数字矩阵AB。元素明智分工的最佳方式是什么:A[i,j]/B[i,j]?我知道有可能使用双for循环。但我想要最有效的方法。R:基于元素的矩阵分区

编辑:当有B[i,j] == 0它必须是A[i,j] <- 0

+0

我现在记得:当有'B [i,j] == 0'时我必须做什么,所以它必须是'A [i,j] < - 0'? –

+0

我不知道我能否做到这一点(只考虑上/下选票)。但现在看起来可能。 –

回答

6

如果您的矩阵是AB,则可以使用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的元素,你可能会得到NaNInf-Inf,取决于其在A对应。

0/0 
# NA 

1/0 
# Inf 

-1/0 
# -Inf 

所有这些都不是有限的。如果你想用0来取代它们,只需做:

C <- A/B 
C[!is.finite(C)] <- 0 

这是很难记住[R如何处理NANaNInf-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