元高専生のロボット作り

元高専生のロボット作り

主にプログラミング, 電子系について書きます。たまに機械系もやります。メモ代わりの記事ばっか書きます

processing で行列式の計算をしてみる

こんにちは。

行列の計算ライブラリはすでに多くありますが、再確認のため1から書いてみました。 processingというかjavaで書いたのは後で使うためです。

コード

//java

void setup()
{
  float[][] A = {{ 1,  2,  3,  4, 5},
                 {16, 17, 18, 19, 6},
                 {15, 24, 25, 20, 7},
                 {14, 23, 22, 21, 8},
                 {13, 12, 11, 10, 9}};
  println( determine( A ) );
}
void draw()
{
}

float determine(float m[][])
{
    float result = 0;
    int n = m.length;    //行列mの次元数
    if(n==1)
    {
      result = m[0][0];
    }
    else if(n==2)
    {
      result = m[0][0]*m[1][1]-m[0][1]*m[1][0];
    }
    else if(n==3)
    {
      result =  m[0][0]*m[1][1]*m[2][2]-m[0][0]*m[1][2]*m[2][1]
            +m[0][1]*m[1][2]*m[2][0]-m[0][1]*m[1][0]*m[2][2]
            +m[0][2]*m[1][0]*m[2][1]-m[0][2]*m[1][1]*m[2][0];
    }
    if(n > 3)
    {
      float[][][] _m = new float[n][n-1][n-1];
      float[] c = new float[n];
      for(int k = 0; k < n; k++)
      {
        c[k] = m[k][0];
        for(int j = 1; j < n; j++)
        {
            for(int i = 0; i < k; i++)
            {
              _m[k][i][j-1] = m[i][j];
            }
            for(int i = k+1; i < n; i++)
            {
              _m[k][i-1][j-1] = m[i][j];
            }
        }
        result += c[k] * pow(-1, k) * determine(_m[k]);
      }
    }
    return result;
}

実行すると 11760.0 と表示されるかと思います。

具体的な証明とかはwikipedia見てください。

余因子展開 - Wikipedia

3次元以下ならサラスとかで解けるんですけど4次元以上だと行列式の余因子展開しなければならないんですよね。

プログラムと合わせてみると分かりやすいかもです。

次回はこれを使った何か紹介します。