public class Matrix3D {
    private float[][] elm; // (i,j)成分
    
    // コンストラクタ #0
    Matrix3D() {
        elm = new float[3][3];
        for ( int j = 0; j < 3; ++j ) 
            for ( int i = 0; i < 3; ++i ) 
                elm[i][j] = 0.0f;
    }
    
    // コンストラクタ #1
    Matrix3D(float[][] elmIn) {
        elm = new float[3][3];
        for ( int j = 0; j < 3; ++j ) 
            for ( int i = 0; i < 3; ++i ) 
                elm[i][j] = elmIn[i][j];
    }
    
    // 読み出しメソッド
    public void get(float[][] elmOut) {
        for ( int j = 0; j < 3; ++j ) 
            for ( int i = 0; i < 3; ++i ) 
                elmOut[i] = elm[i];
    }
        
    // 書き込みメソッド 
    public void set(float[][] elmIn) {
        for ( int j = 0; j < 3; ++j ) 
            for ( int i = 0; i < 3; ++i ) 
                elm[i][j] = elmIn[i][j];
    }
    
    // ベクトルとの積： v1 = M v0   
    public void vprod(Vector3D v0, Vector3D v1) {
        float[] crd0 = new float[3];
        float[] crd1 = new float[3];
        
        v0.get( crd0 );  // 座標値の取得
        for ( int i = 0; i < 3; ++i ) {
            crd1[i] = 0.0f;
            for ( int j = 0; j < 3; ++j ) crd1[i] += elm[i][j] * crd0[j];
        }
        v1.set( crd1 );
    }  
    
    // 和： M2 = M0 + M1
    public static void add(Matrix3D m0, Matrix3D m1, Matrix3D m2) {
        for ( int j = 0; j < 3; ++j ) 
            for ( int i = 0; i < 3; ++ i ) 
                m2.elm[i][j] = m0.elm[i][j] + m1.elm[i][j];
    }
    
    // 差： M2 = M0 - M1
    public static void sub(Matrix3D m0, Matrix3D m1, Matrix3D m2) {
        for ( int j = 0; j < 3; ++j ) 
            for ( int i = 0; i < 3; ++i ) 
                m2.elm[i][j] = m0.elm[i][j] - m1.elm[i][j];
    }
    
    // 積： M0 M1
    public static void prod(Matrix3D m0, Matrix3D m1, Matrix3D m2) {
        for ( int j = 0; j < 3; ++j ) 
            for ( int i = 0; i < 3; ++i ) {
                float val = 0.0f;
                for ( int k = 0; k < 3; ++k ) 
                    val += m0.elm[i][k] * m1.elm[k][j];
                m2.elm[i][j] = val;
            }
    }    
    

          
}
