高效地从函数值创建矩阵

7

有经验的R开发人员认为,从给定的函数构造一个具有给定行数和列数的矩阵最高效(但仍易于阅读)的方法是什么,例如A_ij = someFun(i,j),其中1 <= i <= 行,1 <= j <= 列?

由于我在文档中找不到相关内容,因此我想到了以下方法:

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个回答

9
我认为你正在寻找outer(seq(rows),seq(cols),fn)(或者如下所建议的, outer(seq_len(rows),seq_len(cols),fn):需要一些示例来看看这是否有多大差别)。您可以通过这种方式提高可读性(至少如果您不必去查找?outer以了解发生了什么),但我实际上并不认为您会节省太多时间。如果您的fn已经向量化,则可能会有更聪明和更有效的方法:是吗?

1
使用 seq_len 而不是 seq - Richie Cotton
谢谢您很快地回答了这个问题!就$fn$的向量化而言...很遗憾,我还没有找到如何将函数向量化的方法。您可能已经猜到了,我对R还比较陌生(我习惯于使用numpy/scipy、maple等工具),这也是为什么我还没有学会如何将函数向量化的原因。 - fotNelton

7

请看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

如果您只是编写任何函数,可能会在调用“outer”时出现错误,因此请先进行向量化处理。

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

你能提供一个这样的函数的例子吗? - fotNelton
任何一个在向量上调用时无法工作的函数,我遇到这个问题的函数是(在编辑中添加)。 - Spine Feast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接