2017-09-25 13 views
2

私はnumpyで2-dローテーションの精度について頭を悩ましてきました。実装はそう、教科書である、と左手系のための私のアプリケーションの呼び出し:numpyで2次元回転のこの実装について不正確なことはありますか?

from numpy import sin, cos 

def rotate(pathx, pathy, r): 
    """ 
    pathx and pathy are lists of np.float64's recording x and y 
    coordinates of points to be rotated 
    """ 
    c = cos(r) 
    s = sin(r) 
    pathx = c*pathx + s*pathy 
    pathy = -s*pathx + c*pathy 

これをテストするために、私はベクトル(1,1)と予想され、結果とpathx=[1]に供給され、pathy=[1]r=arctan2(1,1)~=pi/4~=0.78539816339744828pi/4

私は[1.4142135623730949, -0.29289321881345221]を取得した後、x軸に合わせる。これが不合理と思われる理由は、私が何かが多く、に近いと考えているからです。0.0にy座標があります。私は入力とsin、cos、arctan2の出力をすべてdtype=float64にすることで、ブーストを試みましたが、それは違いはありませんでした。

私は愚かな間違いをしていますか?それとも、数値的に不安定なものがありますか?私はちょうど...

答えて

2

を誤差の大きさを信じることができないあなたが

pathy = -s*pathx + c*pathy 

を割り当てると、これは今すでに回転させた割り当てられますだけpathx変数を使用しています。回転の前に、最初に関数に渡された配列をpathxとして使用したいとします。

対応して、あなたの現在のアプローチを維持することは容易修正があなたの例の場合は、

(array([ 1.41421356]), array([ 1.11022302e-16])) 
+0

ugh!それでおしまい!すべての間違った場所を見る。私の愚かなノッギンを回してくれてありがとう。 – rschwieb

+0

@rschwiebあなたは大歓迎です。 – miradulo

2

を返すために多分これは、エラーの意味になります

def rotate(pathx, pathy, r): 
    c = np.cos(r) 
    s = np.sin(r) 
    pathx_new = c * pathx + s * pathy 
    pathy_new =-s * pathx + c * pathy 
    return pathx_new, pathy_new 

次のようになります。

pathx_new = c*pathx  + s*pathy 
pathy  = -s*pathx_new + c*pathy 

基本的にはpathxを更新しており、、

rotate(pathxy, 0.78539816339744828) 
array([ 1.41421356, 0.  ]) 

pathxy = np.ones((3,2))ため、次いで

def rotate(pathxy, r): 
    """ 
    pathx and pathy are lists of np.float64's recording x and y 
    coordinates of points to be rotated 
    """ 
    c = np.cos(r) 
    s = np.sin(r) 
    rot = np.array([[c, s], [-s, c]]).T 
    pathxy.dot(rot, out = pathxy) 

pathxy = np.array([pathx, pathy]).T.astype(float) 

:あなたはインプレース再割り当て(私は実際には予想よりも硬い)ため、これをやりたい

その新しい値に基づいて、

rotate(pathxy, 0.78539816339744828) 

pathxy 

array([[ 1.41421356, 0.  ], 
     [ 1.41421356, 0.  ], 
     [ 1.41421356, 0.  ]]) 
+0

面白いインプレースのnumpyイディオムをありがとう。私は実際にそれをしたいかもしれません。一般的にpathxとpathyは非常に長くなる可能性があります。 – rschwieb

関連する問題