2013-05-14 9 views
1

J'ai la fonction suivantevectoriser une fonction R

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

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

Comment puis-je vectoriser la fonction f afin qu'il puisse prendre d'entrée n dimensions et le rendement de sortie n dimensions?

je tentais les éléments suivants

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

Le problème avec cette approche est qu'elle ne couvre pas le cas d'une dimension x. Est-il possible de couvrir les deux cas? Par exemple nous

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

Si je sapply le code à base je reçois la réponse correcte (vecteur n dimensions)

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

Mais si je mets x=1 et exécuter le même code, je reçois le mauvais réponse (vecteur n dimensions au lieu de scalaire)

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

Ce n'est pas surprenant, puisque rowSums appliqué à la colonne vecteur donne le vecteur de colonne. Ce dont j'ai besoin dans le cas de unidimensionnelle, cependant, est d'appliquer sum. Existe-t-il un moyen élégant de le faire sans utiliser le if sous réserve de dimensions?

+0

Vous devriez probablement ajouter un exemple d'entrée/sortie pour les deux cas dont vous parlez. – Dason

+0

'sapply' n'est pas vraiment vectorisant, c'est juste une boucle for déguisée. Il me semble que vous voulez peut-être «externe», mais comme Dason dit que la sortie prévue aiderait. – baptiste

+0

Votre terminologie est confuse pour moi. Vous avez seulement montré 'x' et' X' qui sont unidimensionnels. Et je pense que "vecteur" signifie unidimensionnel. Parlez-vous de tableaux (dimensions supérieures) ou de vecteurs de longueur supérieure à 1? – Frank

Répondre

0

Il semble que vous avez deux exemples, je les ai nommés f et h:

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 

Il ressemblait à colSums est ce que vous cherchez là-bas.