Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.79 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement