Advertisement
damn_ghad

Untitled

Dec 8th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.29 KB | None | 0 0
  1. package tasks;
  2.  
  3. import java.util.Arrays;
  4.  
  5. public class Matrix {
  6.     private double[][] M;
  7.     private int[] size = {0, 0};
  8.  
  9.     Matrix(double[][] instance) {
  10.         M = instance;
  11.         this.size[0] = instance.length;
  12.         this.size[1] = instance[0].length;
  13.     }
  14.  
  15.     private double[][] getMatrix(){
  16.         return this.M;
  17.     }
  18.  
  19.     void Display() {
  20.         if (Arrays.equals(this.size, new int[]{1, 1})){
  21.             System.out.println("failed.");
  22.             return;
  23.         }
  24.         for (int i = 0; i < this.size[0]; i++){
  25.             for (int j = 0; j < this.size[1]; j++){
  26.                 double scale = Math.pow(10, 3);
  27.                 System.out.print(Math.round(this.M[i][j] * scale)/scale + " ");
  28.             }
  29.             System.out.println();
  30.         }
  31.     }
  32.  
  33.     Matrix multiplyScalar(double scalar){
  34.         double[][] mtx = this.M;
  35.         for (int i = 0; i < this.size[0]; i++) {
  36.             for (int j = 0; j < this.size[1]; j++) {
  37.                 mtx[i][j] *= scalar;
  38.             }
  39.         }
  40.         return new Matrix(mtx);
  41.     }
  42.  
  43.     public Matrix addMatrix(Matrix B){
  44.         double[][] res = this.M;
  45.         for (int i = 0; i < this.size[0]; i++){
  46.             for (int j = 0; j < this.size[1]; j++){
  47.                 res[i][j] += B.getMatrix()[i][j];
  48.             }
  49.         }
  50.         return new Matrix(res);
  51.     }
  52.  
  53.     public Matrix subtractMatrix(Matrix B){
  54.         double[][] res = this.M;
  55.         for (int i = 0; i < this.size[0]; i++){
  56.             for (int j = 0; j < this.size[1]; j++){
  57.                 res[i][j] -= B.getMatrix()[i][j];
  58.             }
  59.         }
  60.         return new Matrix(res);
  61.     }
  62.  
  63.     public Matrix multiplyMatrices(Matrix secondMatrix) {
  64.         int r1 = this.size[0];
  65.         int c1 = this.size[1];
  66.         int r2 =secondMatrix.getSize()[0];
  67.         int c2 = secondMatrix.getSize()[1];
  68.  
  69.         if (r2 != c1){
  70.             System.out.println("Cannot multiply matrices");
  71.             return new Matrix(new double[1][1]);
  72.         }
  73.  
  74.         double[][] product = new double[r1][c2];
  75.         for(int i = 0; i < r1; i++) {
  76.             for (int j = 0; j < c2; j++) {
  77.                 for (int k = 0; k < c1; k++) {
  78.                     product[i][j] += this.M[i][k] * secondMatrix.getMatrix()[k][j];
  79.                 }
  80.             }
  81.         }
  82.         return new Matrix(product);
  83.     }
  84.  
  85.     private int[] getSize() {
  86.         return this.size;
  87.     }
  88.  
  89.  
  90.     Matrix Transposed(){
  91.         double[][] res = new double[this.size[1]][this.size[0]];
  92.         for (int i = 0; i < this.size[1]; i++) {
  93.             for (int j = 0; j < this.size[0]; j++) {
  94.                 res[i][j] = this.M[j][i];
  95.             }
  96.         }
  97.         return new Matrix(res);
  98.     }
  99.  
  100.     public double Determinant(Matrix mtx) {
  101.         double[][] matrix = mtx.getMatrix();
  102.         if (this.size[0] != this.size[1]){
  103.             System.out.println("Given input is not square matrix.");
  104.             return Double.MIN_VALUE;
  105.         }
  106.  
  107.         double result = 0;
  108.         if (matrix.length == 1) {
  109.             result = matrix[0][0];
  110.             return result;
  111.         }
  112.         if (matrix.length == 2) {
  113.             result = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
  114.             return result;
  115.         }
  116.         for (int i = 0; i < matrix[0].length; i++) {
  117.             double[][] temp = new double[matrix.length - 1][matrix[0].length - 1];
  118.  
  119.             for (int j = 1; j < matrix.length; j++) {
  120.                 for (int k = 0; k < matrix[0].length; k++) {
  121.                     if (k < i) {
  122.                         temp[j - 1][k] = matrix[j][k];
  123.                     } else if (k > i) {
  124.                         temp[j - 1][k - 1] = matrix[j][k];
  125.                     }
  126.                 }
  127.             }
  128.             result += matrix[0][i] * Math.pow(-1, (int) i) * Determinant(new Matrix(temp));
  129.         }
  130.         return result;
  131.     }
  132.  
  133.     public Matrix Inverse(){
  134.         double[][] matrix = this.Transposed().getMatrix();
  135.         if (matrix.length != 3 || matrix[0].length != 3){
  136.             return new Matrix(new double[1][1]);
  137.         }
  138.  
  139.         double[][] adj = new double[3][3];
  140.         adj[0][0] = Determinant(new Matrix(new double[][]{{matrix[1][1], matrix[1][2]}, {matrix[2][1], matrix[2][2]}}));
  141.         adj[0][1] = Determinant(new Matrix(new double[][]{{matrix[1][0], matrix[1][2]}, {matrix[2][0], matrix[2][2]}}));
  142.         adj[0][2] = Determinant(new Matrix(new double[][]{{matrix[1][0], matrix[1][1]}, {matrix[2][0], matrix[2][1]}}));
  143.         adj[1][0] = Determinant(new Matrix(new double[][]{{matrix[0][1], matrix[0][2]}, {matrix[2][1], matrix[2][2]}}));
  144.         adj[1][1] = Determinant(new Matrix(new double[][]{{matrix[0][0], matrix[0][2]}, {matrix[2][0], matrix[2][2]}}));
  145.         adj[1][2] = Determinant(new Matrix(new double[][]{{matrix[0][0], matrix[0][1]}, {matrix[2][0], matrix[2][1]}}));
  146.         adj[2][0] = Determinant(new Matrix(new double[][]{{matrix[0][1], matrix[0][2]}, {matrix[1][1], matrix[1][2]}}));
  147.         adj[2][1] = Determinant(new Matrix(new double[][]{{matrix[0][0], matrix[0][2]}, {matrix[1][0], matrix[1][2]}}));
  148.         adj[2][2] = Determinant(new Matrix(new double[][]{{matrix[0][0], matrix[0][1]}, {matrix[1][0], matrix[1][1]}}));
  149.  
  150.         for (int i = 0; i < 3; i++){
  151.             for (int j = 0; j < 3; j++){
  152.                 adj[i][j] *= Math.pow(-1, i + j);
  153.             }
  154.         }
  155.  
  156.         return new Matrix(adj).multiplyScalar(1./this.Determinant(this));
  157.     }
  158.  
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement