基于行和列索引高效地填充R中的矩阵

r6l8ljro  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(131)

我在R中填充一个矩阵,最直观的方法是使用两个嵌套循环:一个用于行,一个用于列。然而,这种方法往往相当慢,使用apply()函数通常是更可取的。
如果我只是用某个函数转换矩阵的现有值,那么使用apply一切都很容易,但实际上我使用的是一个外部函数,它将行和列索引作为参数并返回一个值。
该函数可能类似于以下内容(仅举一例):

myfunction <- function(rownumber, colnumber) {
                       if(rownumber + colnumber < 7) {
                          return(4)
                       } else {
                          return(2)
                       }
}

......如果有两个嵌套循环,我们可以这样继续:

m <- matrix(0, nrow = 5, ncol = 5)

for(rownum in 1:nrow(m)) {
    for(colnum in 1:ncol(m)) {
        m[rownum, colnum] <- myfunction(rownum, colnum)
    }
}

结果是这样的:

> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    4    4    4    4    4
[2,]    4    4    4    4    2
[3,]    4    4    4    2    2
[4,]    4    4    2    2    2
[5,]    4    2    2    2    2

我想使用apply()函数来完成这个任务,因为它通常比两个嵌套循环快,但是我不知道如何获得行号和列号--或者这是否可能?一个解决方案是最初将行号和列号作为STRINGS保存到矩阵中,但这同样需要一些时间,因为它需要两个嵌套循环来完成...
有什么主意吗?谢谢。

5uzkadbs

5uzkadbs1#

如果您的函数被有效地矢量化,您可以按如下所示创建行索引矩阵和列索引矩阵:

rownumbers <- matrix(1:4, nrow = 4, ncol = 3)
#      [,1] [,2] [,3]
# [1,]    1    1    1
# [2,]    2    2    2
# [3,]    3    3    3
# [4,]    4    4    4
colnumbers <- t(matrix(1:4, nrow = 4, ncol = 4))[, 1:3]
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    1    2    3
# [3,]    1    2    3
# [4,]    1    2    3

然后做f(rownumbers, colnumbers)

编辑

我刚刚发现了函数colrow,用这些函数构造这两个矩阵比较容易。

i34xakig

i34xakig2#

外部应该完成你所需要的
首先,确保函数可以矢量化:

myfunction <- function(rownumber, colnumber) {
     ifelse(rownumber + colnumber < 7,4,2) # ifelse is vectorized
 }

然后

outer(0:5, 0:5, FUN = myfunction)

相关问题