2013-05-14 104 views
1

我有以下功能向量化的R函数

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

+0

您应该为您谈论的两种情况添加示例输入/输出。 – Dason 2013-05-14 14:02:56

+0

'sapply'不是真正的矢量化,它只是一个变相的循环。在我看来,你可能想要“外部”,但正如达森所说的那样,预期的产出会有所帮助。 – baptiste 2013-05-14 14:07:59

+0

您的术语令我感到困惑。您只显示了一维的'x'和'X'。我认为“矢量”意味着一维。你在谈论数组(高维)还是矢量长度大于1? – Frank 2013-05-14 14:11:50

回答

0

看来,你有两个例子,我将它们命名为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什么你要找的人那里。