AKAGI Rails

鉄道模型シミュレーターで遊んでいたはずが、気づいたらPythonなども。

リスト型をベクトルに見立てて計算したい

いろいろ試していますがVRMNXpyで一向にnumpyが使えません。いい加減やってられないので,リスト型をベクトルに見立てて線形代数の主要な計算ができるコードを用意しました。

vrmapiの命令で使うことが前提なので,クラスを作って演算子をオーバーライドとかは一切せず,リスト型を放り込んでリスト型を返す関数に仕立てました。

def vecdot(vec1, vec2):
    # 内積スカラー)を返す
    p = 0.0
    for i, j in zip(vec1, vec2):
        p += i*j
    return p

def vectrans(matrixA, vecx):
    # 線形変換 Ax
    vecy = []
    for k in range(len(vecx)):
        vecy.append(vecdot(matrixA[k], vecx))
    return vecy

def turnmatrix(matrixA):
    # 行列の転置
    m = len(matrixA)
    n = len(matrixA[0])
    return [[matrixA[i][j] for i in range(m)] for j in range(n)]

def matrixproduct(matrixA, matrixB):
    # 行列の積
    return [vectrans(turnmatrix(matrixB), ai) for ai in matrixA]

 

本来はベクトル計算は,ベクトルの次元が合っているかとか確認しなきゃいけないのですが,あえてそれもしていません。変な行列やベクトルを放り込んだらfor文のあたりでIndexErrorが出るはず。いろいろ雑ですがVRMNXpyで使いそうなベクトル計算はせいぜい3次元なので…。

>>> A = [[1,2],[3,4]]
>>> B = [[5,6],[7,8]]
>>> x = [1,2]
>>> y = [2,2]
>>> vecdot(x,y)
6.0
>>> vectrans(A,x)
[5.0, 11.0]
>>> turnmatrix(A)
[[1, 3], [2, 4]]
>>> matrixproduct(A,B)
[[19.0, 22.0], [43.0, 50.0]]

サンプルは2次元ですが3次元もいけます。