SHARE
TWEET

Untitled

a guest Jan 21st, 2020 79 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.lang.reflect.Array;
  2.  
  3. public class MojaMacierz<T> {
  4.     private int kol, wier;
  5.     private T[][] macierz;
  6.     private Class<T> klasa;
  7.  
  8.     //mnacierz zerowa
  9.     private MojaMacierz(Class<T> c, int wier, int kol) {
  10.         this.wier = wier;
  11.         this.kol = kol;
  12.         this.macierz = (T[][]) Array.newInstance(c, wier, kol);
  13.         this.klasa = c;
  14.         T zero;
  15.  
  16.         if (c == Ulamek.class)
  17.             zero = (T) Ulamek.valueOf(0);
  18.         else if (c == Float.class)
  19.             zero = (T) Float.valueOf(0);
  20.         else if (c == Double.class)
  21.             zero = (T) Double.valueOf(0);
  22.         else throw new IllegalArgumentException("Zly typ");
  23.  
  24.         for (int i = 0; i < wier; i++) {
  25.             for (int j = 0; j < kol; j++)
  26.                 this.wpisz(zero, i, j);
  27.         }
  28.     }
  29.  
  30.     MojaMacierz(Class<T> klasa, T[][] tab) {
  31.         this.wier = tab.length;
  32.         this.kol = tab[0].length;
  33.         this.macierz = (T[][]) Array.newInstance(klasa, wier, kol);
  34.         for (int i = 0; i < wier; i++)
  35.             for (int j = 0; j < kol; j++)
  36.                 this.macierz[i][j] = tab[i][j];
  37.         this.klasa = klasa;
  38.     }
  39.  
  40.     MojaMacierz(MojaMacierz<T> MojaMacierz) {
  41.         this.klasa = MojaMacierz.getKlasa();
  42.         this.wier = MojaMacierz.getWier();
  43.         this.kol = MojaMacierz.getKol();
  44.         this.macierz = (T[][]) Array.newInstance(this.klasa, this.wier, this.kol);
  45.         for (int i = 0; i < MojaMacierz.getWier(); i++)
  46.             for (int j = 0; j < MojaMacierz.getKol(); j++)
  47.                 this.macierz[i][j] = MojaMacierz.macierz[i][j];
  48.     }
  49.  
  50.     int getWier() {
  51.         return wier;
  52.     }
  53.  
  54.     void setWier(int wier) {
  55.         this.wier = wier;
  56.     }
  57.  
  58.     int getKol() {
  59.         return kol;
  60.     }
  61.  
  62.     void setKol(int kol) {
  63.         this.kol = kol;
  64.     }
  65.  
  66.     T[][] getMacierz() {
  67.         return macierz;
  68.     }
  69.  
  70.     void setMacierz(T[][] macierz) {
  71.         this.macierz = macierz;
  72.     }
  73.  
  74.     private void wpisz(T num, int i, int j) {
  75.         this.macierz[i][j] = num;
  76.     }
  77.  
  78.     private T odczytaj(int wiersz, int kolumna) {
  79.         return macierz[wiersz][kolumna];
  80.     }
  81.  
  82.     private Class<T> getKlasa() {
  83.         return klasa;
  84.     }
  85.  
  86.     private void zamienWier(int i, int j) {
  87.         T[] tmp = macierz[i];
  88.         macierz[i] = macierz[j];
  89.         macierz[j] = tmp;
  90.     }
  91.  
  92.     private void zamienKol(int i, int j) {
  93.         T tmp;
  94.         for (int k = 0; k < wier; k++) {
  95.             tmp = macierz[k][i];
  96.             macierz[k][i] = macierz[k][j];
  97.             macierz[k][j] = tmp;
  98.         }
  99.     }
  100.  
  101.     void absMacierz() {
  102.         for (int i = 0; i < this.getWier(); i++)
  103.             this.wpisz(Matematyka.abs(this.odczytaj(i, 0)), i, 0);
  104.     }
  105.  
  106.     T macierzAvg() {
  107.         T sum = zeroValue();
  108.         for (int i = 0; i < this.wier; i++)
  109.             for (int j = 0; j < this.kol; j++)
  110.                 sum = Matematyka.add(sum, this.odczytaj(i, j));
  111.         return (T) Matematyka.div(sum, valueOf(this.wier * this.kol));
  112.     }
  113.  
  114.     MojaMacierz<T> sub(MojaMacierz<T> B) {
  115.         MojaMacierz<T> A = this;
  116.         if (B.wier != A.wier || B.kol != A.kol) throw new RuntimeException("Zle wymiary");
  117.         MojaMacierz<T> W = new MojaMacierz<T>(this.klasa, wier, kol);
  118.         for (int i = 0; i < wier; i++)
  119.             for (int j = 0; j < kol; j++)
  120.                 W.wpisz(Matematyka.sub(A.macierz[i][j], B.macierz[i][j]), i, j);
  121.         return W;
  122.     }
  123.  
  124.     MojaMacierz<T> mul(MojaMacierz<T> B) {
  125.         MojaMacierz<T> A = this;
  126.         if (A.kol != B.wier) throw new RuntimeException("Zle wymiary");
  127.         MojaMacierz<T> W = new MojaMacierz<T>(this.klasa, A.wier, B.kol);
  128.  
  129.         for (int i = 0; i < W.wier; i++)
  130.             for (int j = 0; j < W.kol; j++)
  131.                 for (int k = 0; k < A.kol; k++)
  132.                     W.wpisz(Matematyka.add(W.macierz[i][j], Matematyka.mul(A.macierz[i][k], B.macierz[k][j])), i, j);
  133.         return W;
  134.     }
  135.  
  136.     @Override
  137.     public String toString() {
  138.         StringBuilder stringBuilder = new StringBuilder();
  139.         for (int i = 0; i < wier; i++) {
  140.             stringBuilder.append("[");
  141.             for (int j = 0; j < kol; j++) {
  142.                 stringBuilder.append(odczytaj(i, j));
  143.                 if (j == kol - 1)
  144.                     stringBuilder.append("]");
  145.                 else stringBuilder.append(" ");
  146.             }
  147.             stringBuilder.append("\n");
  148.         }
  149.         return stringBuilder.toString();
  150.     }
  151.  
  152.     //zwraca wartosc 0 danego typu
  153.     private T zeroValue() {
  154.         T zero = null;
  155.         if (klasa == Float.class)
  156.             zero = (T) Float.valueOf(0);
  157.         else if (klasa == Double.class)
  158.             zero = (T) Double.valueOf(0);
  159.         else if (klasa == Ulamek.class)
  160.             zero = (T) Ulamek.valueOf(0);
  161.         return zero;
  162.     }
  163.  
  164.     private T valueOf(int value) {
  165.         T sum = null;
  166.         if (klasa == Float.class)
  167.             sum = (T) Float.valueOf(value);
  168.         else if (klasa == Double.class)
  169.             sum = (T) Double.valueOf(value);
  170.         else if (klasa == Ulamek.class)
  171.             sum = (T) Ulamek.valueOf(value);
  172.         return sum;
  173.     }
  174.  
  175.     private void etap1(MojaMacierz<T> macierz, MojaMacierz<T> wynik, int i) {
  176.         for (int j = i + 1; j < wynik.wier; j++) {
  177.             T param = Matematyka.div(macierz.macierz[j][i], macierz.macierz[i][i]);
  178.             wynik.macierz[j][0] = Matematyka.sub(wynik.macierz[j][0], Matematyka.mul(param, wynik.macierz[i][0]));
  179.  
  180.             for (int k = i; k < wynik.wier; k++)
  181.                 macierz.macierz[j][k] = Matematyka.sub(macierz.macierz[j][k], Matematyka.mul(param, macierz.macierz[i][k]));
  182.         }
  183.     }
  184.  
  185.     //bez wyboru el podst
  186.     MojaMacierz<T> gaussG(MojaMacierz<T> wynik) {
  187.         MojaMacierz<T> macierz = new MojaMacierz<T>(this);
  188.         MojaMacierz<T> result = new MojaMacierz<T>(klasa, wynik.wier, 1);
  189.  
  190.         for (int i = 0; i < wynik.wier; i++) {
  191.             etap1(macierz, wynik, i);
  192.         }
  193.         gaussResult(wynik, result, macierz);
  194.  
  195.         return result;
  196.     }
  197.  
  198.     //czesciowy wybor
  199.     MojaMacierz<T> gaussP(MojaMacierz<T> wynik) {
  200.         MojaMacierz<T> macierz = new MojaMacierz<T>(this);
  201.         MojaMacierz<T> result = new MojaMacierz<T>(klasa, wynik.wier, 1);
  202.  
  203.         for (int i = 0; i < wynik.wier; i++) {
  204.             int max = i;
  205.             for (int j = i + 1; j < wynik.wier; j++)
  206.                 if (Matematyka.compare(Matematyka.abs(macierz.macierz[j][i]), Matematyka.abs(macierz.macierz[max][i])) == 1)
  207.                     max = j;
  208.  
  209.             macierz.zamienWier(i, max);
  210.             wynik.zamienWier(i, max);
  211.  
  212.             etap1(macierz, wynik, i);
  213.         }
  214.         gaussResult(wynik, result, macierz);
  215.  
  216.         return result;
  217.     }
  218.  
  219.     //pelny wybor - funkcja zapo┼╝yczona
  220.     MojaMacierz<T> gaussF(MojaMacierz<T> wynik) {
  221.         MojaMacierz<T> macierz = new MojaMacierz<T>(this);
  222.         MojaMacierz<T> result = new MojaMacierz<T>(klasa, wynik.wier, 1);
  223.         MojaMacierz<T> originalResult = new MojaMacierz<T>(klasa, wynik.wier, 1);
  224.  
  225.         int[] originalPosition;
  226.         originalPosition = new int[wynik.wier];
  227.  
  228.         for (int j = 0; j < wynik.wier; j++)
  229.             originalPosition[j] = j;
  230.  
  231.  
  232.         for (int i = 0; i < wynik.wier; i++) {
  233.             int maxRow = i;
  234.             int maxColumn = i;
  235.  
  236.             for (int j = i; j < macierz.wier; j++) {
  237.                 for (int k = i; k < macierz.kol; k++) {
  238.                     if (Matematyka.compare(Matematyka.abs(macierz.macierz[j][k]), Matematyka.abs(macierz.macierz[maxRow][maxColumn])) == 1) {
  239.                         maxRow = j;
  240.                         maxColumn = k;
  241.                     }
  242.                 }
  243.             }
  244.  
  245.             int tmp = originalPosition[i];
  246.             originalPosition[i] = originalPosition[maxColumn];
  247.             originalPosition[maxColumn] = tmp;
  248.  
  249.             macierz.zamienWier(i, maxRow);
  250.             macierz.zamienKol(i, maxColumn);
  251.             wynik.zamienWier(i, maxRow);
  252.  
  253.             etap1(macierz, wynik, i);
  254.         }
  255.  
  256.         gaussResult(wynik, result, macierz);
  257.  
  258.         for (int j = 0; j < wynik.wier; j++)
  259.             originalResult.macierz[originalPosition[j]][0] = result.macierz[j][0];
  260.  
  261.         return originalResult;
  262.     }
  263.  
  264.     // zapisuje wyniki eliminacji do result
  265.     private void gaussResult(MojaMacierz<T> wynik, MojaMacierz<T> result, MojaMacierz<T> macierz) {
  266.         for (int i = wynik.wier - 1; i >= 0; i--) {
  267.             T sum = zeroValue();
  268.  
  269.             for (int j = i + 1; j < wynik.wier; j++)
  270.                 sum = Matematyka.add(sum, Matematyka.mul(macierz.macierz[i][j], result.macierz[j][0]));
  271.  
  272.             result.macierz[i][0] = Matematyka.div(Matematyka.sub(wynik.macierz[i][0], sum), macierz.macierz[i][i]);
  273.         }
  274.     }
  275. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top