numpy で 2 つの正規直交ベクトル a と b を生成し、2 つのベクトルの外積が別の単位ベクトル k に等しくなるようにする最も簡単で効率的な方法は何ですか?
そのようなペアが無数にあることは知っています。条件 axb=k および ab=0 が満たされている限り、どのペアを取得しても問題ありません。
numpy で 2 つの正規直交ベクトル a と b を生成し、2 つのベクトルの外積が別の単位ベクトル k に等しくなるようにする最も簡単で効率的な方法は何ですか?
そのようなペアが無数にあることは知っています。条件 axb=k および ab=0 が満たされている限り、どのペアを取得しても問題ありません。
これは次のようになります。
>>> 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
申し訳ありませんが、評判が悪いため、コメントとして入れることができません。
@ behzad.nouri の回答に関してk
は、 が単位ベクトルでない場合、コードは直交ベクトルをもう与えないことに注意してください!
これを行う正しい一般的な方法は、ランダム ベクトルの縦方向の部分を減算することです。これの一般的な式は ここにあります
したがって、元のコードでこれを置き換えるだけです。
>>> x -= x.dot(k) * k / np.linalg.norm(k)**2