我在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保存到矩阵中,但这同样需要一些时间,因为它需要两个嵌套循环来完成...
有什么主意吗?谢谢。
2条答案
按热度按时间5uzkadbs1#
如果您的函数被有效地矢量化,您可以按如下所示创建行索引矩阵和列索引矩阵:
然后做
f(rownumbers, colnumbers)
。编辑
我刚刚发现了函数
col
和row
,用这些函数构造这两个矩阵比较容易。i34xakig2#
外部应该完成你所需要的
首先,确保函数可以矢量化:
然后