【问题标题】:Efficiently create a matrix from function values从函数值有效地创建矩阵
【发布时间】:2011-12-17 07:08:35
【问题描述】:

有经验的 R 开发人员认为最有效(但仍然可读)的方法是从给定函数构造具有给定行数和列数的矩阵,例如A_ij = someFun(i,j) with 1

因为我在我想出的文档中找不到任何东西

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

这对我来说似乎很愚蠢而且很慢。欢迎任何改进(尤其是单行)! :)

【问题讨论】:

    标签: r function matrix


    【解决方案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)
      }
    

    【讨论】:

    • 你能提供这样一个功能的例子吗?
    • 任何在向量上调用时都不起作用的函数,我遇到这个问题的那个是(在编辑中添加的)
    【解决方案2】:

    我认为您正在寻找outer(seq(rows),seq(cols),fn)(或如下建议的outer(seq_len(rows),seq_len(cols),fn):需要一些示例来看看有多大的不同)。

    通过这种方式,您可以获得很多可读性(至少如果您不必查找?outer 以了解发生了什么),但我实际上并不认为您节省了很多时间。如果您的 fn 被矢量化以开始,则可能会更聪明、更高效:是吗?

    【讨论】:

    • 或使用seq_len 而不是seq
    • 感谢您这么快回答这个问题!就 $fn$ 的矢量化而言......不幸的是不是。正如您可能猜到的那样,我对 R 相当陌生(我习惯于 numpy/scipy、maple 等),这就是为什么我还没有找到如何向量化函数的原因。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      相关资源
      最近更新 更多