从函数值有效地创建矩阵

时间:2011-10-28 13:05:40

标签: r function matrix

经验丰富的R开发人员将考虑最有效(但仍然可读)的方法来构造具有来自给定函数的给定数量的行和列的矩阵,例如, A_ij = someFun(i,j),1< = i< = rows,1< = j< = cols?

由于我在文档中找不到任何内容,我想出了

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 个答案:

答案 0 :(得分:7)

我认为您正在寻找outer(seq(rows),seq(cols),fn)(或按照以下建议,outer(seq_len(rows),seq_len(cols),fn):需要一些示例才能看出有多大差异。)

你可以获得很多可读性(至少如果你不必去查找?outer来查找正在发生的事情),但我实际上并不认为你节省了很多时间。如果你的fn被矢量化开头,可能会有更聪明,更有效的东西:是吗?

答案 1 :(得分:6)

查看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"

答案 2 :(得分:1)

如果您只是编写任何功能,则可能会在调用“外部”时出错,因此请首先对其进行矢量化。

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