Матричная функция в R

#r #function #if-statement #for-loop #matrix

#r #функция #if-оператор #для цикла #матрица

Вопрос:

Я пытаюсь создать функцию, которая преобразует матрицу (MATR1). Она должна умножать каждый элемент, который является простым, на 2 и возвращать новую матрицу (MATR2). Это то, что я делал до сих пор:

 MATR1 <- matrix()

My.Func <- function(MATR1)
  MATR2 <- matrix(nrow(MATR1), ncol(MATR1))
  for (i in 1:nrow(MATR1)) {
    for(j in 2:ncol(MATR1)) {
      if (MATR1[i,j]%%2 == 0) {
        MATR2[i,j] <- MATR1[i,j]/2
      } else {MATR2[i,j] <- MATR1[i,j]}
    }
  } 
  return(matrix(MATR2, nrow(MATR1)))
  

Но я не могу заставить ее работать. Кто-нибудь может увидеть, где я допустил ошибку? Ценю любую помощь!

Комментарии:

1. It should multiply every element ... тогда в коде MATR2[i,j] <- MATR1[i,j]/2 опечатка?

Ответ №1:

Используйте векторизованные операции вместо for циклов. Вам также понадобится функция для определения, являются ли числа простыми. Существует несколько возможных алгоритмов, но ни один из них не встроен в базу R. Я буду использовать numbers::isPrime здесь, хотя вы можете написать свое собственное простое сито или другой алгоритм с нуля, если хотите.

Во-первых, некоторые настройки:

 library(numbers)

set.seed(47)    # for reproducibility
mat <- matrix(rpois(100, 10), 10)    # sample matrix

mat
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]   16    6    8    7   12   14   10   12    9    14
##  [2,]   12    4    7    8   13    9    7    5   14    15
##  [3,]   10   12    4   15   15   14   12   10   10    12
##  [4,]    9    8    3    9   16   13   12   10    9     9
##  [5,]   10    7    9    9   14   14   10   13    8    11
##  [6,]    6    7    9   13   12    6    7   10    8    11
##  [7,]   10   11    8    8    9    5   10   14   12    11
##  [8,]   14    8   10    7   10   12    8    5   12    14
##  [9,]    4   14    6    5   10   13    7   12   10     6
## [10,]    7    7   10   13   15   16   13    7    9     9
  

Чтобы определить функцию, назначьте подмножеству, которое соответствует критериям:

 double_primes <- function(m){
    m[isPrime(m)] <- m[isPrime(m)] * 2; 
    m
}

double_primes(mat)
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]   16    6    8   14   12   14   10   12    9    14
##  [2,]   12    4   14    8   26    9   14   10   14    15
##  [3,]   10   12    4   15   15   14   12   10   10    12
##  [4,]    9    8    6    9   16   26   12   10    9     9
##  [5,]   10   14    9    9   14   14   10   26    8    22
##  [6,]    6   14    9   26   12    6   14   10    8    22
##  [7,]   10   22    8    8    9   10   10   14   12    22
##  [8,]   14    8   10   14   10   12    8   10   12    14
##  [9,]    4   14    6   10   10   26   14   12   10     6
## [10,]   14   14   10   26   15   16   26   14    9     9