2012-10-16 13 views
6

Mam dwa wektory:Jak mogę mnożyć wektory bez pętli?

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

i chcę, aby pomnożyć każdy element x z każdego elementu w y a następnie Podsumowując to wszystko. To, co chcę zrobić, to coś w rodzaju:

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

Czy istnieje sposób, aby to zrobić bez pętli? Dzięki z góry

+1

wiele sposobów! Czego spróbowałeś do tej pory? znalazłeś '? sum'? – Justin

Odpowiedz

12

Oto co bym używać!

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

Nie fair! Użyłeś _math_! – joran

+0

To oszustwo !!!!!!! :) +1 dla uproszczonego podejścia. Logika bije umiejętności programowania. –

+0

Więc zostałem zgłoszony do migracji na math.stackexchange.com? –

5

Spróbuj:

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

wektoryzowane operatorzy są zadbane!

?mapply jest również przydatna funkcja, aby pamiętać podczas wykonywania tego rodzaju zadań: np

mapply("*",x,y) 

... zrobi x [1] * y [1] x [2] * Y [2], etc ... wytwarzać

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

funkcji Podsumowanie jak sum może być również stosowany z jednej strony, jak:

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

co oznacza drogę długo ręki robi swoje obliczenia byłyby również:

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

Trzy inne pomysły oprócz Josh i thelatemail wspaniałe pomysły:

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

i jako bardziej wyraźny wariant drugiej 'sumy (zewnętrznej (x, y," * "))' – Henry

4

Możemy użyć x %*% t(y) uzyskać macierz, która ma produktów, które chcemy, a następnie po prostu użyć sum dodać wszystko w matrycy razem .

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

i nieco bardziej wydajna wersja tej samej idei (Dzięki Gavin)

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

Kolejny oszust math: P + 1 –

+0

+1 'tcrossprod (x, y)' ma być nieznacznie bardziej wydajna wersja 'x% *% t (y)'. –

Powiązane problemy