外積が意味を成す場合に常に機能する短いコード スニペットを次に示します。3D バージョンはベクトルを返し、2D バージョンはスカラーを返します。外部ライブラリを使用せずに正しい答えを返す単純なコードが必要な場合は、これで十分です。
# Compute the vector cross product between x and y, and return the components
# indexed by i.
CrossProduct3D <- function(x, y, i=1:3) {
# Project inputs into 3D, since the cross product only makes sense in 3D.
To3D <- function(x) head(c(x, rep(0, 3)), 3)
x <- To3D(x)
y <- To3D(y)
# Indices should be treated cyclically (i.e., index 4 is "really" index 1, and
# so on). Index3D() lets us do that using R's convention of 1-based (rather
# than 0-based) arrays.
Index3D <- function(i) (i - 1) %% 3 + 1
# The i'th component of the cross product is:
# (x[i + 1] * y[i + 2]) - (x[i + 2] * y[i + 1])
# as long as we treat the indices cyclically.
return (x[Index3D(i + 1)] * y[Index3D(i + 2)] -
x[Index3D(i + 2)] * y[Index3D(i + 1)])
}
CrossProduct2D <- function(x, y) CrossProduct3D(x, y, i=3)
それは機能しますか?
オンラインで見つけたランダムな例を確認してみましょう。
> CrossProduct3D(c(3, -3, 1), c(4, 9, 2)) == c(-15, -2, 39)
[1] TRUE TRUE TRUE
かなり良さそうです!
これが以前の回答よりも優れているのはなぜですか?
- それは 3D です (カールのものは 2D のみでした)。
- シンプルで慣用句です。
- うまくコメントされ、フォーマットされています。したがって、理解しやすい
欠点は、数字「3」が数回ハードコーディングされていることです。実際、これはそれほど悪いことではありません。なぜなら、ベクトルの外積が純粋に 3D 構造であるという事実が浮き彫りになるからです。個人的には、外積を完全にやめて、代わりに幾何代数を学ぶことをお勧めします。:)