mramine364

matrix.java

Jul 4th, 2016
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.96 KB | None | 0 0
  1.  
  2. public class matrix {
  3.     private double[][] M;
  4.     private static double epsilon = 1e-14;
  5.     /* construtors */
  6.     public matrix(int n){
  7.         this(n,n);
  8.     }
  9.     public matrix(int n, int m){
  10.         M = new double[n][m];
  11.     }
  12.     public matrix(int n, int m, double d){
  13.         M = new double[n][m];
  14.         for(int i=0;i<n;i++){
  15.             for(int j=0;j<m;j++){
  16.                 set(i, j, d);
  17.             }
  18.         }
  19.     }
  20.     public matrix(double[][] t){
  21.         M = new double[t.length][t[0].length];
  22.         for(int i=0;i<t.length;i++){
  23.             for(int j=0;j<t[i].length;j++){
  24.                 set(i, j, t[i][j]);
  25.             }
  26.         }
  27.     }
  28.     public matrix(matrix m){
  29.         this(m.M);
  30.     }
  31.     public matrix(matrix m,int sr,int sc,int er,int ec){
  32.         M = new double[er-sr+1][ec-sc+1];
  33.         int r=0,c=0;
  34.         for(int i=sr;i<=er && i<m.rlen();i++){
  35.             for(int j=sc;j<=ec && j<m.clen();j++){
  36.                 set(r, c, m.get(i, j));
  37.                 c++;
  38.             }
  39.             r++; c=0;
  40.         }
  41.     }
  42.     /* */
  43.    
  44.     public static matrix rand(int n, int m, double min, double max, int round){
  45.         matrix mat = new matrix(n,m);
  46.         double nb;
  47.         double p = Math.pow(10, round);
  48.         for(int i=0;i<n;i++){
  49.             for(int j=0;j<n;j++){
  50.                 nb = Math.random()*(max-min+1)+min;
  51.                 mat.set(i, j, Math.round(nb*p)/p);
  52.             }
  53.         }
  54.         return mat;
  55.     }
  56.     public static matrix rand(int n, int m){        
  57.         return matrix.rand(n,m,0,100,2);
  58.     }
  59.    
  60.     @Override
  61.     public String toString(){
  62.         String str = "[";
  63.         for(int i=0;i<M.length-1;i++){
  64.            str += "[";
  65.            for(int j=0;j<M[i].length-1;j++){
  66.                str += M[i][j]+", ";
  67.            }
  68.            str += M[i][M[i].length-1];
  69.            str += "], ";
  70.         }
  71.         str += "[";
  72.         for(int j=0;j<M[M.length-1].length-1;j++){
  73.             str += M[M.length-1][j]+", ";
  74.         }
  75.         str += M[M.length-1][M[M.length-1].length-1];
  76.         str += "]";
  77.         str += "]";
  78.         return str;
  79.     }
  80.     public double get(int i, int j){
  81.         return M[i][j];
  82.     }
  83.     public final void set(int i, int j, double n){
  84.         if( n < epsilon && n > -epsilon )
  85.             M[i][j] = 0;
  86.         else
  87.             M[i][j] = n;
  88.     }
  89.     public int rlen(){
  90.         return M.length;
  91.     }
  92.     public int clen(){
  93.         return M[0].length;
  94.     }
  95.    
  96.     public matrix add(matrix b){
  97.         matrix m = new matrix(rlen(), clen());
  98.         for(int i=0;i<m.rlen();i++){
  99.            for(int j=0;j<m.clen();j++){
  100.                m.set(i, j, get(i,j)+b.get(i, j));
  101.            }
  102.         }
  103.         return m;
  104.     }
  105.     public matrix minus(matrix b){
  106.         matrix m = new matrix(rlen(), clen());
  107.         for(int i=0;i<m.rlen();i++){
  108.            for(int j=0;j<m.clen();j++){
  109.                m.set(i, j, get(i,j)-b.get(i, j));
  110.            }
  111.         }
  112.         return m;
  113.     }
  114.     public matrix mul(matrix b){
  115.         // condition this.clen = b.rlen
  116.         matrix m = new matrix(rlen(), b.clen());
  117.         for(int i=0;i<m.rlen();i++){
  118.             for(int j=0;j<m.clen();j++){
  119.                 double rij = 0;
  120.                 for(int ki=0;ki<clen();ki++){
  121.                     rij += get(i,ki)*b.get(ki,j);
  122.                 }
  123.                 m.set(i, j, rij);
  124.             }
  125.         }
  126.         return m;
  127.     }
  128.    
  129.     public static double pow2(double a, int b){
  130.         if(b==0)
  131.             return 1;
  132.         double r = pow2(a,b/2);
  133.         if(b%2==0)            
  134.             return r*r;
  135.         else
  136.             return r*r*a;        
  137.     }
  138.     // next or equal power of two of n nepot(4)=4 && nepot(5)=8
  139.     public static int nepot(int n){
  140.         double d = Math.log(n)/Math.log(2);
  141.         int p = (int) d;
  142.         if( p==d )
  143.             return n;
  144.         else
  145.             return (int)pow2(2,p+1);        
  146.     }
  147.    
  148.     public matrix strassen(matrix m){
  149.         int n=m.rlen();
  150.         if(n<=32)
  151.             return mul(m);
  152.         matrix res = new matrix(n,n);
  153.         // find next power of 2
  154.         int nepot = nepot(n);
  155.         matrix m1,m2,m3,m4,m5,m6,m7,a11,a12,a21,a22,b11,b12,b21,b22;
  156.         a11 = new matrix(this,0,0,nepot/2-1,nepot/2-1);
  157.         a12 = new matrix(this,0,nepot/2,nepot/2-1,nepot-1);
  158.         a21 = new matrix(this,nepot/2,0,nepot-1,nepot/2-1);
  159.         a22 = new matrix(this,nepot/2,nepot/2,nepot-1,nepot-1);
  160.         b11 = new matrix(m,0,0,nepot/2-1,nepot/2-1);
  161.         b12 = new matrix(m,0,nepot/2,nepot/2-1,nepot-1);
  162.         b21 = new matrix(m,nepot/2,0,nepot-1,nepot/2-1);
  163.         b22 = new matrix(m,nepot/2,nepot/2,nepot-1,nepot-1);
  164.         m1 = a11.add(a22).strassen(b11.add(b22));
  165.         m2 = a21.add(a22).strassen(b11);
  166.         m3 = a11.strassen(b12.minus(b22));
  167.         m4 = a22.strassen(b21.minus(b11));
  168.         m5 = a11.add(a12).strassen(b22);
  169.         m6 = a21.minus(a11).strassen(b11.add(b12));
  170.         m7 = a12.minus(a22).strassen(b21.add(b22));
  171.         matrix c11,c12,c22,c21;
  172.         c11 = m1.add(m4).minus(m5).add(m7);
  173.         c12 = m3.add(m5);
  174.         c21 = m2.add(m4);
  175.         c22 = m1.minus(m2).add(m3).add(m6);
  176.         for(int i=0;i<c11.rlen();i++){
  177.             for(int j=0;j<c11.rlen();j++){
  178.                 res.set(i, j, c11.get(i, j));
  179.             }
  180.         }
  181.         for(int i=0;i<c11.rlen();i++){
  182.             for(int j=c11.rlen();j<n;j++){
  183.                 res.set(i, j, c12.get(i, j-c11.rlen()));
  184.             }
  185.         }
  186.         for(int i=c11.rlen();i<n;i++){
  187.             for(int j=0;j<c11.rlen();j++){
  188.                 res.set(i, j, c21.get(i-c11.rlen(), j));
  189.             }
  190.         }
  191.         for(int i=c11.rlen();i<n;i++){
  192.             for(int j=c11.rlen();j<n;j++){
  193.                 res.set(i, j, c22.get(i-c11.rlen(), j-c11.rlen()));
  194.             }
  195.         }
  196.         return res;
  197.     }
  198.  
  199.     public matrix mul(double c){
  200.         matrix m = new matrix(this);
  201.         for(int i=0;i<rlen();i++){
  202.             for(int j=0;j<clen();j++){
  203.                 m.set(i, j, c*m.get(i, j));
  204.             }          
  205.         }
  206.         return m;
  207.     }
  208.     public matrix transpose(){
  209.         matrix T = new matrix(clen(), rlen());
  210.         for(int i=0;i<rlen();i++){
  211.             for(int j=0;j<clen();j++){
  212.                 T.set(j, i, get(i, j));
  213.             }
  214.         }
  215.         return T;
  216.     }
  217.     // row basic operations
  218.     public matrix rowSwitching(int li, int lj){
  219.         double temp;
  220.         for(int i=0;i<clen();i++){
  221.             temp = get(li, i);
  222.             set(li, i, get(lj, i));
  223.             set(lj, i, temp);
  224.         }
  225.         return this;
  226.     }
  227.     public matrix rowMultiplication(int li, double k){
  228.         for(int i=0;i<clen();i++){
  229.             set(li, i, get(li, i)*k);
  230.         }
  231.         return this;
  232.     }
  233.     public matrix rowAddition(int li, int lj, double k){
  234.         // li <- li + k*lj && k <> 0
  235.         for(int i=0;i<clen();i++){
  236.             set(li, i, get(li, i)+get(lj, i)*k);
  237.         }
  238.         return this;
  239.     }
  240.     public matrix submatrix(int si, int sj){
  241.         matrix m = new matrix(rlen()-1, clen()-1);
  242.         int ki=0, kj=0;
  243.         for(int i=0;i<rlen();i++){
  244.             if( si==i ){
  245.                 continue;
  246.             }
  247.             for(int j=0;j<clen();j++){
  248.                 if( sj!=j ){
  249.                     m.set(ki, kj, get(i, j));
  250.                     if( kj == m.clen()-1 ){
  251.                         kj = 0;
  252.                     }else{
  253.                         kj++;
  254.                     }                    
  255.                 }
  256.             }
  257.             ki++;
  258.         }
  259.         return m;
  260.     }
  261.     public double trace(){
  262.         double tr = 0;
  263.         for(int i=0;i<rlen();i++){            
  264.             tr += get(i, i);
  265.         }
  266.         return tr;
  267.     }
  268.     public double det(){
  269.         if( clen()==1 && rlen()==1 )
  270.             return get(0, 0);
  271.         double det = 0;
  272.         int p = 1;
  273.         for(int i=0;i<rlen();i++){
  274.             if( get(0, i)!=0 )
  275.                 det += p*get(0,i)*submatrix(0, i).det();
  276.             p *= -1;
  277.         }
  278.         return det;
  279.     }
  280.     public matrix inverse(){
  281.         matrix inv = new matrix(rlen(), clen());
  282.         double det = det(); int p;
  283.         for(int i=0;i<rlen();i++){
  284.             for(int j=0;j<clen();j++){
  285.                 p = ( (i+j)%2==0 ) ? 1 : -1;
  286.                 inv.set(i, j, p*submatrix(j, i).det()/det);
  287.             }
  288.         }
  289.         return inv;
  290.     }
  291.     public boolean isInversible(){
  292.         return det() != 0;
  293.     }
  294.     private static boolean equalsDouble(double a, double b){
  295.         return Math.abs( a-b )<epsilon;
  296.     }
  297.     public boolean equals(matrix L){
  298.         if( L.rlen()!=rlen() || L.clen()!=clen() )
  299.             return false;
  300.         for(int i=0;i<L.rlen();i++){
  301.             for(int j=0;j<L.clen();j++){
  302.                 if( !equalsDouble(L.get(i, j), get(i, j)) )
  303.                     return false;
  304.             }
  305.         }
  306.         return true;
  307.     }
  308. }
Advertisement
Add Comment
Please, Sign In to add comment