@Override public <T extends Matrix> T copy() { return (T)new DMatrix2x2(this); }
@Override public double get(int row, int col) { return unsafe_get(row,col); }
@Override public void set(int row, int col, double val) { unsafe_set(row,col,val); }
/** * Converts {@link DMatrixRMaj} into {@link DMatrix2x2} * * @param input Input matrix. * @param output Output matrix. If null a new matrix will be declared. * @return Converted matrix. */ public static DMatrix2x2 convert(DMatrixRMaj input , DMatrix2x2 output ) { if( output == null) output = new DMatrix2x2(); if( input.getNumRows() != output.getNumRows() ) throw new IllegalArgumentException("Number of rows do not match"); if( input.getNumCols() != output.getNumCols() ) throw new IllegalArgumentException("Number of columns do not match"); output.a11 = input.data[0]; output.a12 = input.data[1]; output.a21 = input.data[2]; output.a22 = input.data[3]; return output; }
/** * Converts {@link DMatrix2x2} into {@link DMatrixRMaj}. * * @param input Input matrix. * @param output Output matrix. If null a new matrix will be declared. * @return Converted matrix. */ public static DMatrixRMaj convert(DMatrix2x2 input , DMatrixRMaj output ) { if( output == null) output = new DMatrixRMaj(2,2); output.reshape(input.getNumRows(),input.getNumCols()); output.data[0] = input.a11; output.data[1] = input.a12; output.data[2] = input.a21; output.data[3] = input.a22; return output; }
@Override public <T extends Matrix> T createLike() { return (T)new DMatrix2x2(); }
/** * <p> * Transposes matrix 'a' and stores the results in 'b':<br> * <br> * b<sub>ij</sub> = a<sub>ji</sub><br> * where 'b' is the transpose of 'a'. * </p> * * @param input The original matrix. Not modified. * @param output Where the transpose is stored. If null a new matrix is created. Modified. * @return The transposed matrix. */ public static DMatrix2x2 transpose( DMatrix2x2 input , DMatrix2x2 output ) { if( input == null ) input = new DMatrix2x2(); output.a11 = input.a11; output.a12 = input.a21; output.a21 = input.a12; output.a22 = input.a22; return output; }
/** * Computes inv(A<sup>T</sup>*A)*A<sup>T</sup> */ static void computePseudo(DMatrixRMaj A , DMatrixRMaj output ) { final int N = A.numRows; DMatrix2x2 m = new DMatrix2x2(); DMatrix2x2 m_inv = new DMatrix2x2(); for (int i = 0, index=0; i < N; i++) { double a_i1 = A.data[index++]; double a_i2 = A.data[index++]; m.a11 += a_i1*a_i1; m.a12 += a_i1*a_i2; m.a22 += a_i2*a_i2; } m.a21 = m.a12; CommonOps_DDF2.invert(m,m_inv); output.reshape(2,N); for (int i = 0,index=0; i < N; i++) { output.data[i] = A.data[index++]*m_inv.a11 + A.data[index++]*m_inv.a12; } int end = 2*N; for (int i = N,A_index=0; i < end; i++) { output.data[i] = A.data[A_index++]*m_inv.a21 + A.data[A_index++]*m_inv.a22; } }