2016-09-15 121 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