2012-10-16 10 views
6

ho due vettori:Come posso moltiplicare i vettori senza un loop?

x = c(1,2,3) 
y = c(4,5,2) 

e voglio moltiplicare ogni elemento di x con ogni elemento y e poi riassumere il tutto. Quindi quello che voglio fare è qualcosa del genere:

1*(4 + 5 + 2) + 2*(4 + 5 + 2) + 3*(4 + 5 + 2) = 11 + 22 + 33 = 66 

C'è un modo per farlo senza cicli? Grazie in anticipo

+1

molti modi! Cosa hai provato fino ad ora? hai trovato '? sum'? – Justin

risposta

12

Ecco quello che mi piacerebbe utilizzare!

sum(x) * sum(y) 
# [1] 66 
+6

Non è giusto! Hai usato _math_! – joran

+0

Questo è un imbroglio !!!!!!! :) +1 per l'approccio semplicistico. La logica batte abilità di programmazione. –

+0

Quindi sono stato segnalato per la migrazione a math.stackexchange.com? –

5

Prova:

sum(x*sum(y)) 
[1] 66 

operatori Vectorised sono pulite!

?mapply è anche una funzione utile per tenere a mente quando si fa questo tipo di compiti: Es:

mapply("*",x,y) 

... farà x [1] * y [1], x [2] * y [2] ecc ... per produrre

mapply("*",x,y) 
[1] 4 10 6 

funzioni di sintesi come sum può essere utilizzato anche su un lato, come:

mapply("*",x,sum(y)) 
[1] 11 22 33 

Il che significa un modo a lungo la mano di fare i calcoli sarebbe anche:

sum(mapply("*",x,sum(y))) 
[1] 66 
5

Tre altre idee oltre a Josh ed eccellenti idee di thelatemail:

sum(do.call("*", expand.grid(x, y))) 
sum(outer(x, y)) ## or equivalently: sum(x %o% y) 
sum(sapply(split(x, x), function(z) z * y)) 
+0

e una variante più esplicita del secondo 'sum (outer (x, y," * "))' – Henry

4

Possiamo usare x %*% t(y) per ottenere una matrice che ha i prodotti che vogliamo e poi basta usare sum aggiungere tutto nella matrice insieme .

sum(x %*% t(y)) 
#[1] 66 

e una versione leggermente più efficiente di questa stessa idea (Grazie a Gavin)

sum(tcrossprod(x, y)) 
#[1] 66 
+1

Un altro cheater matematico: P + 1 –

+0

+1 'tcrossprod (x, y)' dovrebbe essere un po ' versione più efficiente di 'x% *% t (y)'. –

Problemi correlati