行列演算

行列演算


  • 正方行列とは行数と列数が等しい行列を言う(n×n型の行列)。4×4の正方行列の次数は4となる。unityが標準クラスとして持っているのはこれ
  • 行列の足し算、引き算では行列が同じ型(互いに4×4の行列等)である必要がある。その和を求めるには対応する要素同士を足し合わせる
  • unityのMatrix4x4には足し算、引き算の機能は無い

こちらも合わせて参考にする事:Matrix4x4クラスのメモ

Matrix4x4関連のヘルパー関数


unityのMatrix4x4ではマトリックス同士の足し算、引き算、スカラー倍の計算がサポートされていない
以下のサンプルコードはそれを補助するものである



using UnityEngine;
using System.Collections;

public static class MatrixCalc
{
  public static Matrix4x4 Matrix4x4Scalar (Matrix4x4 matrixA, float x)
   {
       Matrix4x4 answer;
       answer = Matrix4x4.zero;
       for (int i = 0; i < 3; i++) {
           for (int j = 0; j < 3; j++) {
               answer [i, j] = matrixA [i, j]*x;
           }
       }
       return answer;
   }

  public static Matrix4x4 Matrix4x4Plus (Matrix4x4 matrixA, Matrix4x4 matrixB)
   {
       Matrix4x4 answer;
       answer = Matrix4x4.zero;
       for (int i = 0; i < 3; i++) {
           for (int j = 0; j < 3; j++) {
               answer [i, j] = matrixA [i, j] + matrixB [i, j];
           }
       }
       return answer;
   }
   
   public static Matrix4x4 Matrix4x4Minus (Matrix4x4 matrixA, Matrix4x4 matrixB)
   {
       Matrix4x4 answer;
       answer = Matrix4x4.zero;
       for (int i = 0; i < 3; i++) {
           for (int j = 0; j < 3; j++) {
               answer [i, j] = matrixA [i, j] - matrixB [i, j];
           }
       }
       return answer;
   }
}

/// <summary>
/// Random matrix.
/// 乱数をマトリックスにセットする
/// int及びfloatが可能。min最小値・max最大値・identityデータを3Dで利用しやすくする
/// </summary>
public static class RandomMatrix
{
  public static Matrix4x4 Set(int min,int max,bool identity=false)
   {
       Matrix4x4 randomMat;
       randomMat = Matrix4x4.zero;
       
       for (int i = 0; i < 16; i++) {
           randomMat[i] =  Random.Range(min,max);
       }
       if(identity){randomMat = SetIdentity(randomMat);}
       return randomMat;
   }
   
   public static Matrix4x4 Set(float min,float max,bool identity=false)
   {
       Matrix4x4 randomMat;
       randomMat = Matrix4x4.zero;
       
       for (int i = 0; i < 16; i++) {
           randomMat[i] =  Random.Range(min,max);
       }
       if(identity){randomMat = SetIdentity(randomMat);}
       return randomMat;
   }
   
   public static Matrix4x4 SetIdentity (Matrix4x4 randomMat)
   {
       randomMat.m30 =0;
       randomMat.m31 =0;
       randomMat.m32 =0;
       randomMat.m33 =1;
       randomMat.m03 =0;
       randomMat.m13 =0;
       randomMat.m23 =0;
       //        randomMat.m00 =1;
       //        randomMat.m11 =1;
       //        randomMat.m22 =1;
       
       return randomMat;
   }
}



<ヘルパー関数を使った行列の方程式の解>

行列A
4 5
1 -2

行列B
0 -1
-3 2

が与えられた時、2X=3A-Bを満たす行列Xを求める

  Matrix4x4 matA,matB,matX;

  void Start () {

      matA.m00=4;
       matA.m01=5;
       matA.m10=1;
       matA.m11=-2;

      matB.m00=0;
       matB.m01=-1;
       matB.m10=-3;
       matB.m11=2;

      print(matA);
       print(matB);

      matX =  MatrixCalc.Matrix4x4Scalar( MatrixCalc.Matrix4x4Minus(MatrixCalc.Matrix4x4Scalar(matA,3),matB),1.0f/2.0f);
       print(matX);
   }

行列X
6 8
3 -4
になる








  • 最終更新:2013-12-03 22:57:13

このWIKIを編集するにはパスワード入力が必要です

認証パスワード