2013-05-14 84 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什麼你要找的人那裏。