根据行和列索引在 R 中有效地填充矩阵

问题描述 投票:0回答:1

我在 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() 函数,因为它通常比两个嵌套循环快,但我不知道如何获取行号和列号——或者这是否可能?一种解决方案是将行号和列号最初作为字符串保存到矩阵中,但这同样需要一些时间,因为它需要用两个嵌套循环来完成......

有什么想法吗?谢谢。

r matrix apply
1个回答
0
投票

您可以使用

outer
+
ifelse

outer(1:nrow(m), 1:ncol(m), \(rownum, colnum) {
  ifelse(rownum + colnum < 7, 4, 2)
})

#      [,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
© www.soinside.com 2019 - 2024. All rights reserved.