6

私は2つのベクトルを持っています:

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

xそして、の各要素にの各要素を掛けてy、それをすべて合計したいと思います。だから私がやりたいのは、次のようなものです。

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

ループなしでそれを行う方法はありますか?前もって感謝します

4

4 に答える 4

12

これが私が使うものです!

sum(x) * sum(y)
# [1] 66
于 2012-10-16T22:38:45.193 に答える
5

試す:

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

ベクトル化された演算子はきちんとしています!

?mapplyまた、これらの種類のタスクを実行するときに覚えておくと便利な関数です。例:

mapply("*",x,y)

... x [1] * y [1]、x [2] *y[2]などを実行して生成します

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

次のような要約関数はsum、次のように一方の側でも使用できます。

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

つまり、計算を行うための手間のかかる方法は次のようにもなります。

sum(mapply("*",x,sum(y)))
[1] 66
于 2012-10-16T22:37:48.567 に答える
5

Joshとthelatemailの優れたアイデア以外の3つのアイデア:

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))
于 2012-10-16T22:40:11.290 に答える
4

を使用x %*% t(y)して、必要な製品を含むマトリックスを取得し、マトリックスsum内のすべてを一緒に追加するために使用できます。

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

そして、これと同じアイデアのもう少し効率的なバージョン(Gavinに感謝)

sum(tcrossprod(x, y))
#[1] 66
于 2012-10-16T23:18:28.230 に答える