Эффективно создать матрицу из значений функции - PullRequest
6 голосов
/ 28 октября 2011

Что бы опытные R-разработчики сочли наиболее эффективным (но все еще читаемым) способом построения матрицы с заданным количеством строк и столбцов из данной функции, такой, например, как A_ij = someFun (i, j) с 1 <=я <= rows, 1 <= j <= cols? </p>

Так как я не смог найти что-то в документации, я придумал

initMatrix <- function(rows, cols, fn) {
    A <- matrix(nrow=rows, ncol=cols)
    for (i in 1:rows)
        for (j in 1:cols)
            A[i,j] <- fn(i,j)
    return(A)
}

, что мне кажется глупым и медленным.Любые улучшения (особенно однострочные) приветствуются!:)

Ответы [ 3 ]

7 голосов
/ 28 октября 2011

Я думаю, что вы ищете outer(seq(rows),seq(cols),fn) (или, как предложено ниже, outer(seq_len(rows),seq_len(cols),fn): понадобится несколько примеров, чтобы увидеть, сколько различий это имело).

Вы можете значительно улучшить читаемость (по крайней мере, если вам не нужно искать ?outer, чтобы узнать, что происходит), но я не думаю, что вы сэкономите много времени.Что-то умнее и эффективнее может быть возможно, если ваш fn векторизован для начала: это?

6 голосов
/ 28 октября 2011

взгляните на outer:

> outer (LETTERS [1:3], letters [4:7], paste)
     [,1]  [,2]  [,3]  [,4] 
[1,] "A d" "A e" "A f" "A g"
[2,] "B d" "B e" "B f" "B g"
[3,] "C d" "C e" "C f" "C g"
1 голос
/ 20 марта 2018

Если вы просто напишите какую-либо функцию, вы можете получить ошибки при вызове 'external', поэтому сначала выполните векторизацию.

fn <- function(i,j){ ... }

A <- outer(1:rows, 1:cols, Vectorize(fn))

Пример, где это не будет работать без векторизации:

fn <- function(i,j){
  return(prop.test(c(tables[i,1], tables[j,1]), c(sum(tables[i,]), sum(tables[j,])))$p.value)
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...