2016-10-13 48 views
-1

編寫一個函數,該函數將一個可以強制轉換爲矩陣的矩陣;該函數應返回一個與函數參數相同的矩陣,但每個偶數不變,而奇數加倍。如何將函數應用於R中的矩陣

enter image description here

我很新的R.有人可以幫助我完成我的代碼:

mx = matrix(c(1,1,3,5,2,6,-2,-1,-3), nrow = 3, byrow = TRUE) 
fun = function(mx){ 
    for(i in mx){ 
    if(i %% 2 == 0){ 
     return(i) 
    } 
    else if(i %% 2 > 0){ 
     return(2*i) 
    } 
    } 
} 
+0

您的矩陣具有僅* *正整數或負整數? – agenis

回答

3

不需要的功能,只需使用內置功能ifelse

mx <- ifelse(mx %% 2 == 0, mx, 2*mx) 

或者,如果你喜歡它封裝到一個函數:

fun = function(mx) { 
    ifelse(mx %% 2 == 0, mx, 2*mx) 
} 
res <- fun(mx) 
##  [,1] [,2] [,3] 
##[1,] 2 2 6 
##[2,] 10 2 6 
##[3,] -2 -2 -6 

說明:

ifelse執行在矩陣MX的所有元素的矢量比較,以查看是否每個元素是偶數(即,mx %% 2 == 0)。對於每個元素,如果此比較條件爲TRUE,則返回下一個參數,在這種情況下,該參數僅爲mx中該元素的值。否則,將返回最後一個參數,即mx中該元素的值的2倍。

+0

mx是否代表矩陣的條目? –

+1

不,'mx'是你的矩陣。這個函數(和'ifelse')在矩陣的所有元素上被矢量化。 – aichao

1

這很容易使用指數:)

double_odd <- function(mx){ 
    odds_idx <- (mx %% 2 != 0) 
    mx[odds_idx] <- 2 * mx[odds_idx] 
    mx # If it is the last statement, you don't need return 
} 

乾杯

+0

Thx!代碼更容易理解。 –

+0

隨時upvote:D –

+0

我認爲你的代碼可能有一些錯誤,因爲我得到了另一個結果:矩陣(C(1,1,3,5,4,12,-4,-1,-3),羅= TRUE)這不是問題的答案 –

0

使用您的嘗試:

fun = function(mx){ 
res <- matrix(data = NA, ncol = ncol(mx), nrow = nrow(mx)) 
    for(i in 1:ncol(mx)){ 
    for(j in 1:nrow(mx)) 
     if(mx[j, i] %% 2 == 0){ 
     res[j, i] <- mx[j, i] 
     }else{ 
     res[j, i] <- 2 * mx[j, i] 
     } 
    } 
return(res) 
} 
當然

不是最優雅的解決方案:)

相關問題