【问题标题】:R fill up matrix without using a loopR填充矩阵而不使用循环
【发布时间】:2019-03-10 19:28:57
【问题描述】:

大家好,我正在寻找一些编码建议和技巧。我有一个像这样的 10x10 矩阵:

mat <- matrix(NA, nrow = 10, ncol = 10)

还有一个接受两个数字并返回一个简单标量的函数:

fct <- function(x1, x2){
return(x1 * x2)
}

我的函数有点复杂,但这只是为了说明目的。

我想通过将函数 fct 应用于两个向量来填充矩阵垫,比如说:

x1 <- c(1:10)
x2 <- c(1:10)

我可以通过循环轻松完成,但我想知道是否有人知道更好的方法,也许使用 mapply/Map。

感谢您的帮助!

【问题讨论】:

  • 喜欢outer(x1, x2) 吗?您需要将您的函数传递给outerFUN 参数,默认为"*"
  • 效率很大程度上取决于你的函数是否被矢量化......
  • 感谢@markus 和Gregor。我只是将我的函数矢量化并使用了我以前不知道的外部。它就像一个魅力

标签: r loops matrix apply mapply


【解决方案1】:

像这样对函数进行向量化:

fct <- function(x1, x2){
out <- numeric(length = length(x1))
for(i in seq_along(x1)) {
    out[i] <- x1[i] * x2[i]
 }
return(out)
}

然后应用外层:

outer(x1, x2, fct)

会成功的!

谢谢!

【讨论】:

  • 如果你上面介绍的是你的函数真正应该做的,那么你应该使用outer(x1, x2) 这将比你的非矢量化解决方案更有效:library(microbenchmark); x1 &lt;- c(1:1000); x2 &lt;- c(1:1000); microbenchmark(OP = outer(x1, x2, fct), outer = outer(x1, x2), times = 20)
  • @markus 我创建的函数有点复杂,根据一组条件返回一个数字。我想做的事情对我来说效果很好。但我只使用了小向量,所以你可能对效率是正确的。非常感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2011-09-29
相关资源
最近更新 更多