2016-10-18 143 views
1

我正在嘗試創建一個將轉換矩陣(MATR1)的函數。它應該將每個素數乘以2並返回新矩陣(MATR2)。這是我迄今爲止所做的:R中的矩陣函數

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))) 

但我無法讓它工作。任何人都可以看到我犯了一個錯誤嗎?感謝所有幫助!

+0

'應該乘以每個元素...'然後在代碼' MATR2 [i,j] < - MATR1 [i,j]/2',錯字? – zx8754

回答

3

使用矢量化操作而不是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