2012-10-16 20 views
6

は、私は2つのベクトルがあります。どのようにしてループなしでベクトルを乗算できますか?

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

を、私はy内の各要素をxの各要素を乗算して、それをすべてを合計します。だから私がしたいことは、次の行に沿ったものです:

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

ループなしで行う方法はありますか?事前に感謝

+1

多くの方法!これまでに何を試しましたか? '?sum'を見つけましたか? – Justin

答えて

12

ここで私が使用したいものです!

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

フェアー!あなたは_math_を使用しました! – joran

+0

それは浮気しています!!!!!!! :)簡単なアプローチのための+1。ロジックはプログラミングスキルに打撃を与えます。 –

+0

math.stackexchange.comへの移行のフラグが立てられましたか? –

5

試してみてください。

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

ベクトル化事業者はきちんとしています! 例::

?mapply

は、タスクのこれらの種類を行う際に心に留めておくためにも便利な機能です

mapply("*",x,y) 

...尽くすX [1] * Y [1]、X [2]

mapply("*",x,sum(y)) 
[1] 11 22 33 
01: sumも同様に、一方の側に使用することができるよう* Y [2]等...

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

要約関数を生成します

もなり、あなたの計算を行うの長い手の道を意味します

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

ジョシュと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

と2番目の 'sum(outer(x、y、" * "))のより明示的な変形として – Henry

4

私たちは、私たちが望む製品を持って行列を取得するためにx %*% t(y)を使用して、ちょうど一緒に行列にすべてのものを追加するためにsumを使用することができます。

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

そして、この同じ考えの少しより効率的なバージョン(ギャビンのおかげで)

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

もう1つの数学的詐欺師:P + 1 –

+0

+1' tcrossprod(x、y) 'は少し'x%*%t(y)'のより効率的なバージョンです。 –

関連する問題