Операции в матрице со значениями (i, j) без циклов for или while - PullRequest
2 голосов
/ 27 апреля 2019

Мне нужно написать функцию в R, которая получает в качестве входных данных целое число n> 1 и генерирует выходную матрицу P, где P_ {i, j} = min (i, j) для (i, j) = 1, ..., п. Эта функция не должна иметь петли for и while.

До сих пор я пытался с помощью следующего кода.

mat <- function(n){
  m <- matrix(0,nrow = n,ncol = n)
  if(row(m) >= col(m)){
    col(m)
  }
  else{
    row(m)
  }
}

Я знаю, что при условии if, row (m) и col (m) я должен быть способен просматривать матрицу, однако я не знаю, как установить это для этих условий, у меня может быть минимум строка (m) и col (m) в положении (i, j). Я знаю, что не достигну последнего с условиями, которые у меня были выше, но пока я ближе всех.

Примером является следующее. Если n = 3, то результат должен быть:

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    2    2
[3,]    1    2    3

1 Ответ

3 голосов
/ 27 апреля 2019

Попробуйте pmin, row и col

f1 <- function(n = 3) {
  mat <- matrix(nrow = n, ncol = n)
  pmin(row(mat), col(mat))
}


f1()
#     [,1] [,2] [,3]
#[1,]    1    1    1
#[2,]    1    2    2
#[3,]    1    2    3

Или используйте outer и pmin, что более эффективно

f2 <- function(n = 3) {
  idx <- sequence(n)
  outer(idx, idx, pmin)
}

тест

library(microbenchmark)
n <- 10000
b <- microbenchmark(
  f1 = f1(n),
  f2 = f2(n),
  times = 10
)

library(ggplot2)
autoplot(b)

enter image description here

b
#Unit: seconds
# expr      min       lq     mean   median       uq      max neval cld
#   f1 5.554471 5.908210 5.924173 5.950610 5.996274 6.058502    10   b
#   f2 1.272793 1.298099 1.354428 1.309208 1.464950 1.495362    10  a 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...