【问题标题】:Vectorising an R function向量化 R 函数
【发布时间】:2013-05-14 22:21:33
【问题描述】:

我有以下功能

f <- function(x){sum(g(x - X))}

在哪里

X - n-dimensional vector with some data
g is some vecrtorized function

如何对函数 f 进行矢量化处理,以便它可以接受 n 维输入并产生 n 维输出?

我正在尝试以下方法

rowSums(sapply(x, "-", X))

这种方法的问题在于它没有涵盖一维x的情况。是否可以涵盖这两种情况?比如让

x <- c(1,2,3)
X <- c(6,9,1)
g <- function(x){x^2}

如果我使用基于sapply 的代码,我会得到正确答案(n 维向量)

rowSums(sapply(x, "-", X))
[1] -12 -21   3

但如果我设置 x=1 并运行相同的代码,我会得到错误的答案(n 维向量而不是标量)

rowSums(sapply(x, "-", X))
[1] -5 -8  0

这并不奇怪,因为rowSums 应用于列向量会给出列向量。对于一维x,我需要的是应用sum。有没有不使用if 以尺寸为条件的优雅方法?

【问题讨论】:

  • 您可能应该为您谈论的两种情况添加示例输入/输出。
  • sapply 并不是真正的矢量化,它只是一个伪装的 for 循环。在我看来,您可能想要outer,但正如 Dason 所说,预期的输出会有所帮助。
  • 你的术语让我很困惑。您只显示了一维的xX。我认为“向量”是一维的。你说的是数组(更高维度)还是长度大于 1 的向量?
  • 我的意思是向量是 n 维的,就像 R^n 的元素和一维的标量,就像 R 的元素。那就是当提到维度时我在谈论向量长度。
  • @baptiste:谢谢,这正是我需要的。

标签: r vectorization


【解决方案1】:

你好像有两个例子,我把它们命名为fh

X <- c(6,9,1)

g <- function(x){x^2}
f <- function(x){sapply(x,function(x)sum(g(x - X)))}

f(1) 
# [1] 89
f(1:3)
# [1] 89 66 49

h <- function(x){colSums(sapply(x,function(x) x-X))}
h(1)
# [1] -13
h(1:3)
# [1] -13 -10  -7

看起来colSums 就是您要在那里寻找的东西。

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多