2016-05-20 10 views
0
import math 

class Vector(): 

    vA = [3.183, 7.627] 

    def magnitude(vector): 
     sum = 0 
     i = 0 
     while i < len(vector): 
      sum += vector[i] 
      i += 1 
     return math.sqrt(sum) 

    def unitVector(vector): 
     print(1/(magnitude(vA) * vA)) 

私は、いくつかの線形代数をコーディングし、上記のベクトル 'vA'の単位ベクトルを計算しようとしています。私がコードを実行すると、NameError: global name 'magnitude' is not definedが得られます。なぜ私は単に別の関数を呼び出すことに問題があるのか​​分かりません。メソッドを呼び出す際に問題が発生する

私はPythonの初心者です。私はクラスと関数について誤解があると想定していますが、ドキュメントを見て、私が探している答えを見つけることができません。

+1

'self.magnitude' – Praveen

+0

インスタンスメソッドは、自己のパラメータを必要とする –

+0

追記:numpyのライブラリはメソッドの –

答えて

1

あなたはあなたのコード内のいくつかのエラーを持っている:

  • def magnitude(vector)def magnitude(self, vector)
  • def unitVector(vector)def unitVector(self, vector)
  • magnitude(vA)があるべきであるべきである必要がありself.magnitude(vA)

EDIT:

あなたのクラスを書くより良い方法は、PythonでOOPの概念を使うことです。そのため、インスタンス変数にした場合、関数の引数としてvectorを渡す必要はありません。

あなたのクラスは、次のように書き直しすることができます。

import math 

class Vector(): 

    def __init__(self, vector): 
     self.vector = vector 


    def magnitude(self): 
     sum = 0 
     i = 0 
     while i < len(self.vector): 
      sum += self.vector[i] 
      i += 1 
     return math.sqrt(sum) 

    def unitVector(self): 
     print(1/(self.magnitude() * self.vector)) 

vA = [3.183, 7.627] 
vec = Vector(vA) 
vec.unitVector() 

することは、ない作業を行うことに注意してください。 unitVectorでは、Pythonはfloatにリストを掛ける方法を知らないので(self.magnitude()はfloatを返し、self.vectorはリストです)。あなたはおそらくこの部分を再加工したいと思うでしょう。

+0

マグニチュードは本当に、パラメータを必要としない線形代数計算を行うには、おそらくより良いです有効な点 –

+0

どれもが本当にまた1 –

+0

を必要としないものの –

関連する問題