は、私は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
ループなしで行う方法はありますか?事前に感謝
は、私は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
ループなしで行う方法はありますか?事前に感謝
ここで私が使用したいものです!
sum(x) * sum(y)
# [1] 66
フェアー!あなたは_math_を使用しました! – joran
それは浮気しています!!!!!!! :)簡単なアプローチのための+1。ロジックはプログラミングスキルに打撃を与えます。 –
math.stackexchange.comへの移行のフラグが立てられましたか? –
試してみてください。
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
ジョシュと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))
と2番目の 'sum(outer(x、y、" * "))のより明示的な変形として – Henry
私たちは、私たちが望む製品を持って行列を取得するためにx %*% t(y)
を使用して、ちょうど一緒に行列にすべてのものを追加するためにsum
を使用することができます。
sum(x %*% t(y))
#[1] 66
そして、この同じ考えの少しより効率的なバージョン(ギャビンのおかげで)
sum(tcrossprod(x, y))
#[1] 66
もう1つの数学的詐欺師:P + 1 –
+1' tcrossprod(x、y) 'は少し'x%*%t(y)'のより効率的なバージョンです。 –
多くの方法!これまでに何を試しましたか? '?sum'を見つけましたか? – Justin