gpt4 book ai didi

r - 如何对每个矩阵元素的索引应用函数

转载 作者:行者123 更新时间:2023-12-03 06:10:36 26 4
gpt4 key购买 nike

我想知道R中是否有一个内置函数,可以将函数应用于矩阵的每个元素(当然,该函数应该基于矩阵索引来计算)。等效的内容是这样的:

matrix_apply <- function(m, f) {
m2 <- m
for (r in seq(nrow(m2)))
for (c in seq(ncol(m2)))
m2[[r, c]] <- f(r, c)
return(m2)
}

如果没有这样的内置函数,初始化矩阵以包含通过计算以矩阵索引作为参数的任意函数获得的值的最佳方法是什么?

最佳答案

我怀疑你想要外部:

> mat <- matrix(NA, nrow=5, ncol=3)

> outer(1:nrow(mat), 1:ncol(mat) , FUN="*")
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 4 6
[3,] 3 6 9
[4,] 4 8 12
[5,] 5 10 15

> outer(1:nrow(mat), 1:ncol(mat) , FUN=function(r,c) log(r+c) )
[,1] [,2] [,3]
[1,] 0.6931472 1.098612 1.386294
[2,] 1.0986123 1.386294 1.609438
[3,] 1.3862944 1.609438 1.791759
[4,] 1.6094379 1.791759 1.945910
[5,] 1.7917595 1.945910 2.079442

这会产生一个很好的紧凑输出。但 maply 在其他情况下可能会很有用。将 maply 视为执行本页上其他人使用 Vectorize 所执行的相同操作的另一种方法是有帮助的。 mapply 更为通用,因为 Vectorize 无法使用“原始”函数。

data.frame(mrow=c(row(mat)),   # straightens out the arguments
mcol=c(col(mat)),
m.f.res= mapply(function(r,c) log(r+c), row(mat), col(mat) ) )
# mrow mcol m.f.res
1 1 1 0.6931472
2 2 1 1.0986123
3 3 1 1.3862944
4 4 1 1.6094379
5 5 1 1.7917595
6 1 2 1.0986123
7 2 2 1.3862944
8 3 2 1.6094379
9 4 2 1.7917595
10 5 2 1.9459101
11 1 3 1.3862944
12 2 3 1.6094379
13 3 3 1.7917595
14 4 3 1.9459101
15 5 3 2.0794415

您可能并不是真的想向函数提供 row() 和 col() 函数将返回的内容:这会生成一个由 15 个(有些冗余)3 x 5 矩阵组成的数组:

> outer(row(mat), col(mat) , FUN=function(r,c) log(r+c) )

关于r - 如何对每个矩阵元素的索引应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com