2016-10-13 3 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. В противном случае возвращается последний аргумент, который равен 2 умножает значение этого элемента на mx, как вы пожелаете.

+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

Не стесняйтесь: D –

+0

Я думаю, что у ваших кодов могут быть некоторые ошибки, потому что у меня есть другой результат: матрица (C (1,1,3,5,4,12, -4, -1, -3), byrow = 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) 
} 

, конечно, не самое элегантное решение :)

Смежные вопросы