34

私はばかげた質問をしているように感じ crossprodますが、ベクトル入力に関する R の関数の意図は何ですか? ユークリッド空間で 2 つのベクトルの外積を計算したかったのですが、誤って を使用してみcrossprodました。
ベクトルの外積の 1 つの定義はN = |A|*|B|*sin(theta)、theta が 2 つのベクトル間の角度である場合です。( の方向はNAB 面に垂直です)。それを計算する別の方法は、 です N = Ax*By - Ay*Bx
base::crossprodは明らかにこの計算を行わず、実際には 2 つの入力のベクトル内積を生成しsum(Ax*Bx, Ay*By)ます。

vectorxprod(A,B)そのため、独自の関数を簡単に作成できますがcrossprod、一般的に何をしているのかわかりません。

R - ベクトルの外積の計算 (物理学)も参照してください。

4

6 に答える 6

27

R のヘルプ関数によると、 crossprod (X,Y) = t(X)%*% Y は、式自体よりも高速な実装です。これは 2 つの行列の関数であり、ベクトルが 2 つある場合は内積に対応します。@Hong-Ooi のコメントは、クロス積と呼ばれる理由を説明しています。

于 2013-03-01T16:59:01.903 に答える
13

外積が意味を成す場合に常に機能する短いコード スニペットを次に示します。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 構造であるという事実が浮き彫りになるからです。個人的には、外積を完全にやめて、代わりに幾何代数を学ぶことをお勧めします。:)

于 2014-02-12T18:43:02.347 に答える
4

ヘルプ?crossprodはそれを非常に明確に説明しています。たとえば、y = XB + e見つけたいモデルの場合、転置とX'Xの積である線形回帰を考えてみましょう。それを取得するには、単純な呼び出しで十分です: is the same as is the same as . また、2 つのベクトルの内積を求めるためにも使用できます。XXcrossprod(X)crossprod(X,X)t(X) %*% Xcrossprod

于 2013-03-01T18:52:40.527 に答える
2

以下は、3D ベクトルの最小限の実装です。

vector.cross <- function(a, b) {
    if(length(a)!=3 || length(b)!=3){
        stop("Cross product is only defined for 3D vectors.");
    }
    i1 <- c(2,3,1)
    i2 <- c(3,1,2)
    return (a[i1]*b[i2] - a[i2]*b[i1])
}

u2D ベクトルとのスカラー「外積」を取得する場合は、次のvようにします。

vector.cross(c(u,0),c(v,0))[3]
于 2016-03-24T07:16:29.760 に答える
2

@Bryan Hanson のリクエストに応えて、平面内の 2 つのベクトルのベクトルクロス積を計算するための Q&D コードを次に示します。一般的な 3 空間ベクトルのクロス積を計算したり、N 空間に拡張したりするのは少し面倒です。それらが必要な場合は、ウィキペディアにアクセスする必要があります :-) .

crossvec <- function(x,y){
if(length(x)!=2 |length(y)!=2) stop('bad vectors')
 cv <-  x[1]*y[2]-x[2]*y[1]
return(invisible(cv))
}
于 2013-06-04T15:23:23.287 に答える