11

numpy で 2 つの正規直交ベクトル a と b を生成し、2 つのベクトルの外積が別の単位ベクトル k に等しくなるようにする最も簡単で効率的な方法は何ですか?

そのようなペアが無数にあることは知っています。条件 axb=k および ab=0 が満たされている限り、どのペアを取得しても問題ありません。

4

3 に答える 3

15

これは次のようになります。

>>> k  # an arbitrary unit vector k is not array. k is must be numpy class. np.array
np.array([ 0.59500984,  0.09655469, -0.79789754])

最初のものを取得するには:

>>> x = np.random.randn(3)  # take a random vector
>>> x -= x.dot(k) * k       # make it orthogonal to k
>>> x /= np.linalg.norm(x)  # normalize it

2 番目のものを取得するには:

>>> y = np.cross(k, x)      # cross product with k

確認するには:

>>> np.linalg.norm(x), np.linalg.norm(y)
(1.0, 1.0)
>>> np.cross(x, y)          # same as k
array([ 0.59500984,  0.09655469, -0.79789754])
>>> np.dot(x, y)            # and they are orthogonal
-1.3877787807814457e-17
>>> np.dot(x, k)
-1.1102230246251565e-16
>>> np.dot(y, k)
0.0
于 2015-11-11T19:58:10.377 に答える
10

申し訳ありませんが、評判が悪いため、コメントとして入れることができません。

@ behzad.nouri の回答に関してkは、 が単位ベクトルでない場合、コードは直交ベクトルをもう与えないことに注意してください!

これを行う正しい一般的な方法は、ランダム ベクトルの縦方向の部分を減算することです。これの一般的な式は ここにあります

したがって、元のコードでこれを置き換えるだけです。

>>> x -= x.dot(k) * k / np.linalg.norm(k)**2
于 2017-06-02T08:32:34.140 に答える