Advertisement
filip710

Z2.3: Moj matrix.h

Jul 9th, 2016
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.22 KB | None | 0 0
  1. U ovom zadatku cilj je napisati implementaciju funkcija deklariranih u matrix.h datoteci. Njihova implementacija piše se u matrix.c datoteci. Detaljno pročitajte komentare u svim datotekama postavljenim unutar VPL aktivnosti.
  2.  
  3. //Z1.C
  4.  
  5. /* U ovom zadatku trebate implementirati funkcije koje su deklarirane u
  6.  * matrix.h datoteci, a koriste se u ovoj main funkciji. Ukoliko ispravno
  7.  * implementirate deklarirane funkcije, kod u main() funkciji ce proci testove
  8.  * bez ikakvog mijenjanja. Svu implementaciju koda pisete u matrix.c
  9.  * datoteku. Kao sto vidite, u main() funkciji su pozivi funkcija koje ce
  10.  * odraditi test caseove. Ima 8 testnih slucajeva i 8 funkcija u kojima je
  11.  * kod prilagodjen za svaki testni slucaj. Funkcija case1() nije zakomentirana,
  12.  * dok su preostale funkcije zakomentirane. Preporucujemo da kako implementirate
  13.  * pojedine funkcije u matrix.c, postepeno odkomentirate i pozive test caseova
  14.  * u main() funkciji, jer vam se tako program nece rusiti zbog jos neimplementiranih
  15.  * funkcija u matrix.c.
  16.  *
  17.  * Ukoliko zelite, sve tri datoteke mozete skinuti i zadatak rijesiti i u nekom
  18.  * drugom kompajleru (Visual Studio, DevCpp ili slicni).
  19.  *
  20.  * U ovom zadatku ne trazi se nikakvo upisivanje podataka u program, svi podaci
  21.  * u matricama generiraju se slucajno. Zbog toga preporuka je program pokretati
  22.  * klikom na RUN tipku, jer tako lakse mozete pratiti izvrsavanje programa.
  23.  *
  24.  * Implementacija NewRandomMatrix funkcije vam je zadana, isto kao i
  25.  * implementacija funkcije za ispis matrice. Sve ostale funkcije trebate vi
  26.  * implementirati.
  27.  */
  28. #include <stdio.h>  
  29. #include <stdlib.h>
  30. #include "matrix.h"
  31.  
  32. /*
  33. 1.c matrix.c
  34. */
  35.  
  36. //deklaracije funkcija  
  37. void case1();
  38. void case2();
  39. void case3();
  40. void case4();
  41. void case5();
  42. void case6();
  43. void case7();
  44. void case8();
  45.  
  46. int main(void) {
  47.   //gasenje std bufferinga
  48.   setvbuf(stdout, NULL, _IONBF, 0);
  49.  
  50. /* Odkomentirajte one testcaseove cije ste funkcije u matrix.c implementirali.
  51.  * Kada je sve implementirano, odkomentirajte sve pozive test caseova i program
  52.  * ce proci. U svakom test caseu mozete vidjeti koje se funkcije pozivaju. */
  53.  
  54.   case1();
  55.   case2();
  56.   case3();
  57.   case4();
  58.   case5();
  59.   case6();
  60.   case7();
  61.   case8();
  62.  
  63.   return 0;
  64. }
  65.  
  66. void case1() {
  67.   srand(1000);
  68.   double **M1, **M2;
  69.   puts("->Kreiranje dvije prazne matrice: ");
  70.   M1 = newMatrix(4,4 );
  71.   M2 = newMatrix(4,4 );
  72.   matrixPrint(M1, 4,4);
  73.   matrixPrint(M2, 4,4);
  74.   puts("");
  75. }
  76.  
  77. void case2() {
  78.   srand(1000);
  79.   //kreiranje dvije random matrice u rasponu <1.0,2.0>
  80.   double **M1, **M2;
  81.   puts("->Kreiranje dvije random matrice: ");
  82.   M1 = newRandomMatrix(4,4, 1.0, 2.0);
  83.   M2 = newRandomMatrix(4,4, 1.0, 2.0);
  84.  
  85.   matrixPrint(M1, 4,4);
  86.   matrixPrint(M2, 4,4);
  87.  
  88.   matrixDelete(M1,4,4);
  89.   matrixDelete(M2,4,4);
  90.   puts("");
  91. }
  92.  
  93. void case3() {
  94.   srand(1000);
  95.   //mnozenje clan-po-clan dvije random matrice
  96.   double **M1, **M2, **M3;
  97.   M1 = newRandomMatrix(4,4, 1.0, 2.0);
  98.   M2 = newRandomMatrix(4,4, 1.0, 2.0);
  99.  
  100.   puts("->Mnozenje clan po clan dvije matrice");
  101.   puts("->Ulazne matrice:");
  102.   matrixPrint(M1, 4,4);
  103.   matrixPrint(M2, 4,4);
  104.  
  105.   puts("->Rezultat:");
  106.   M3 = matrixElementwiseMultiply(M1,M2,4,4);
  107.   matrixPrint(M3, 4,4);
  108.  
  109.   matrixDelete(M1,4,4);
  110.   matrixDelete(M2,4,4);
  111.   matrixDelete(M3,4,4);
  112.   puts("");
  113. }
  114.  
  115. void case4() {
  116.   srand(1000);
  117.   //zbrajanje dvije random matrice
  118.   double **M1, **M2, **M3;
  119.   M1 = newRandomMatrix(4,4, 1.0, 2.0);
  120.   M2 = newRandomMatrix(4,4, 1.0, 2.0);
  121.  
  122.   puts("->Zbrajanje dvije matrice:");
  123.   puts("->Ulazne matrice:");
  124.   matrixPrint(M1, 4,4);
  125.   matrixPrint(M2, 4,4);
  126.  
  127.   puts("->Rezultat:");
  128.   M3 = matrixAdd(M1,M2,4,4);
  129.   matrixPrint(M3, 4,4);
  130.  
  131.   matrixDelete(M1,4,4);
  132.   matrixDelete(M2,4,4);
  133.   matrixDelete(M3,4,4);
  134.   puts("");
  135. }
  136.  
  137. void case5() {
  138.   srand(1000);
  139.   //oduzimanje dvije random matrice
  140.   double **M1, **M2, **M3;
  141.   M1 = newRandomMatrix(4,4, 1.0, 2.0);
  142.   M2 = newRandomMatrix(4,4, 1.0, 2.0);
  143.  
  144.   puts("->Oduzimanje dvije matrice:");
  145.   puts("->Ulazne matrice:");
  146.   matrixPrint(M1, 4,4);
  147.   matrixPrint(M2, 4,4);
  148.  
  149.   puts("->Rezultat:");
  150.   M3 = matrixSubtract(M1,M2,4,4);
  151.   matrixPrint(M3, 4,4);
  152.  
  153.   matrixDelete(M1,4,4);
  154.   matrixDelete(M2,4,4);
  155.   matrixDelete(M3,4,4);
  156.   puts("");
  157. }
  158.  
  159. void case6() {
  160.   srand(1000);
  161.   double **M1, **M2, **Meye;
  162.   M1 = newRandomMatrix(4,4, 1.0, 2.0);
  163.  
  164.   puts("->Kreiranje nove jedinicne matrice dimenzija 4:");
  165.   puts("->Ulazne matrice:");
  166.   Meye = newEye(4);
  167.   M2 = matrixElementwiseMultiply(M1,Meye,4,4);
  168.   matrixPrint(M1, 4,4);
  169.   matrixPrint(Meye, 4,4);
  170.  
  171.   puts("->Ispis rezultata:");
  172.   matrixPrint(M2, 4,4);
  173.  
  174.   matrixDelete(M1,4,4);
  175.   matrixDelete(M2,4,4);
  176.   matrixDelete(Meye,4,4);
  177.   puts("");
  178. }
  179.  
  180.  
  181. void case7() {
  182.   srand(1000);
  183.   double **M1, **M2, **M3;
  184.   M1 = newRandomMatrix(2,3, 1.0, 2.0);
  185.   M2 = newRandomMatrix(3,4, 1.0, 2.0);
  186.  
  187.   puts("->Mnozenje dvije matrice (metoda matricnog mnozenja) - ispravne dimenzije:");
  188.   puts("->Ulazne matrice:");
  189.   matrixPrint(M1, 2,3);
  190.   matrixPrint(M2, 3,4);
  191.  
  192.   puts("->Ispis rezultata:");
  193.   M3 = matrixMultiply(M1, 2, 3, M2, 3,4);
  194.   matrixPrint(M3, 2,4);
  195.  
  196.   matrixDelete(M1,2,3);
  197.   matrixDelete(M2,3,4);
  198.   matrixDelete(M3,2,4);
  199.   puts("");
  200. }
  201.  
  202. void case8(){
  203.   srand(1000);
  204.   double **M1, **M2, **M3;
  205.   M1 = newRandomMatrix(2,4, 1.0, 2.0);
  206.   M2 = newRandomMatrix(3,4, 1.0, 2.0);
  207.  
  208.   puts("->Mnozenje dvije matrice (metoda matricnog mnozenja) - neispravne dimenzije:");
  209.   puts("->Ulazne matrice:");
  210.   matrixPrint(M1, 2,3);
  211.   matrixPrint(M2, 3,4);
  212.  
  213.   puts("->Ispis rezultata:");
  214.   M3 = matrixMultiply(M1, 2, 4, M2, 3,4);
  215.   matrixPrint(M3,2,4);
  216.   puts("");
  217. }
  218.  
  219. //FUNKCIJE
  220. #include <stdio.h>
  221. #include <stdlib.h>
  222. #include <time.h>
  223. #include "matrix.h"
  224.  
  225. /**** Implementirane funkcije - ove funkcije ne trebate mijenjati ****/
  226. //funkcija print je vec implementirana, nju samo koristite.
  227. void matrixPrint(double **X, int rows, int columns) {
  228.   int i, j;
  229.   printf("Matrix: %dx%d\n", rows, columns);
  230.   if (X == NULL)
  231.     puts("Matrix is NULL!");
  232.   else {
  233.     for (i = 0; i < rows; i++) {
  234.       for (j = 0; j < columns; j++) {
  235.         printf("%.2f\t", X[i][j]);
  236.       }
  237.       printf("\n");
  238.     }
  239.   }
  240.   printf("\n");
  241. }
  242. //buduci da je srand() funkcija izvrsena u mainu, u ovoj funkciji se ne poziva.
  243. //Primjetite kako ova implementacija funkcije koristi NewMatrix() funkciju, pa
  244. //ispravan rad ove funkcije ovisi o ispravnom radu NewMatrix() funkcije.
  245. double** newRandomMatrix( int rows, int columns, double low, double high) {
  246.   double **data;
  247.   int i,j;
  248.   data = newMatrix(rows, columns);
  249.   for (i = 0; i < rows; i++) {
  250.     for (j = 0; j < columns; j++) {
  251.       data[i][j] = (high - low)*((float)rand()/RAND_MAX) + low;
  252.     }
  253.   }
  254.   return data;
  255. }
  256.  
  257.  
  258.  
  259. /**** VAS KOD OVDJE: Sve ostale funkcije u ovom fileu trebate vi implementirati ****/
  260. double** newMatrix(int rows, int columns) {
  261. int i,j;
  262. double **Matrix;
  263.  
  264. Matrix=(double**)malloc(rows*sizeof(double*));
  265.  
  266. for(i=0;i<rows;i++)
  267. {
  268.     for(j=0;j<columns;j++)
  269.     {
  270.         *(Matrix+i)=(double*)malloc(columns*sizeof(double));
  271.     }
  272. }
  273.  
  274. for(i=0;i<rows;i++)
  275. {
  276.     for(j=0;j<columns;j++)
  277.     {
  278.         Matrix[i][j]=0;
  279.     }
  280. }
  281. return Matrix;
  282. }
  283.  
  284.  
  285.  
  286. double** newEye(int n) {
  287.  
  288. int i,j;
  289. double **IdMatrix;
  290. IdMatrix=newMatrix(n,n);
  291. for(i=0;i<n;i++)
  292. {
  293.     for(j=0;j<n;j++)
  294.     {
  295.         if(i==j)
  296.         IdMatrix[i][j]=1;
  297.     }
  298. }
  299. return IdMatrix;
  300. }
  301.  
  302.  
  303. double** newFromSTDIN(int rows, int columns) {
  304. int i,j;
  305. double **inputMatrix;
  306. inputMatrix=newMatrix(rows, columns);
  307. for(i=0;i<rows;i++)
  308. {
  309.     for(j=0;j<columns;j++)
  310.     {
  311.         scanf("%lf",&inputMatrix[i][j]);
  312.     }
  313. }
  314. return inputMatrix;
  315. }
  316.  
  317.  
  318. void matrixDelete(double **X, int rows, int cols) {
  319. int i;
  320.     for (i = 0; i < rows; i++){  
  321.        free(X[i]);  
  322.     }    
  323.  free(X);
  324. }
  325.  
  326.  
  327. double** matrixMultiply(double** M1, int r1, int c1, double** M2, int r2, int c2) {
  328. int i,j,k;
  329. double **resultMatrix;
  330. resultMatrix=newMatrix(r1,c2);
  331. if(c1!=r2) return NULL;
  332.  
  333. for(i=0; i<r1; i++)
  334. {
  335.     for(j=0; j<c2; j++)
  336.     {
  337.         for(k=0; k<c1; k++)
  338.         {
  339.             resultMatrix[i][j]+=M1[i][k]*M2[k][j];
  340.         }
  341.     }
  342. }
  343. return resultMatrix;
  344. }
  345.  
  346.  
  347. double** matrixElementwiseMultiply(double** M1, double** M2, int rows, int columns) {
  348.     int i,j;
  349.     double **multMatrix;
  350.     multMatrix=newMatrix(rows, columns);
  351.    
  352.     for(i=0;i<rows;i++)
  353.     {
  354.         for(j=0;j<columns;j++)
  355.         {
  356.             multMatrix[i][j]=M1[i][j]*M2[i][j];
  357.         }
  358.     }
  359. return multMatrix;
  360. }
  361.  
  362. double** matrixAdd(double** M1, double** M2, int rows, int columns) {
  363.     int i,j;
  364.     double **resultMatrix;
  365.     resultMatrix=newMatrix(rows, columns);
  366.    
  367.     for(i=0;i<rows;i++)
  368.     {
  369.         for(j=0;j<columns;j++)
  370.         {
  371.             resultMatrix[i][j]=M1[i][j]+M2[i][j];
  372.         }
  373.     }
  374. return resultMatrix;
  375. }
  376.  
  377. double** matrixSubtract(double** M1, double** M2, int rows, int columns) {
  378.     double **resultMatrix;
  379.     int i,j;
  380.     resultMatrix=newMatrix(rows, columns);
  381.    
  382.     for(i=0;i<rows;i++)
  383.     {
  384.         for(j=0;j<columns;j++)
  385.         {
  386.             resultMatrix[i][j]=M1[i][j]-M2[i][j];
  387.         }
  388.     }
  389. return resultMatrix;
  390. }
  391.  
  392. //HEADER
  393. #ifndef MATRIX_H
  394. #define MATRIX_H
  395. // Ovo je potrebno samo za Visual studio
  396. #define _CRT_SECURE_NO_WARNINGS
  397.  
  398.  
  399. //Kreira novu matricu dimenzija predanih u parametrima, te vraca adresu
  400. //te matrice. Unutar funkcije potrebno je dinamicki alocirati memoriju za
  401. //podatke u matrici. Postaviti sve elemente matrice na 0.
  402. double** newMatrix(int , int);
  403.  
  404. //Kreira novu matricu dimenzija predanih u prva dva parametra. Kreiranu matricu
  405. //potrebno je popuniti slucajnim brojevima, gdje druga dva parametra
  406. //predstavljaju minimalnu i maksimalnu vrijednost raspona unutar kojega ce biti
  407. //kreirani slucajni brojevi. Buduci da je funkcija srand() pozvana na
  408. //pocetku svakog testa casea, random generator je inicijaliziran pa ju nemojte
  409. //pozivati u ovoj funkciji. Ako ju pozovete, moguce je da ce se generirani
  410. //slucajni brojevi razlikovati od onih koje generira grader, pa vam nece
  411. //prolaziti test caseovi
  412. double** newRandomMatrix(int, int, double, double);
  413.  
  414. //Kreira novu jedinicnu matricu koja ce biti dimenzija predanih u parametru.
  415. //Podsjetimo se: jedinicna matrica je kvadratna matrica koja ima sve clanove
  416. //nula, osim onih na glavnoj dijagonali, koji imaju vrijednost 1.
  417. double** newEye(int);
  418.  
  419. //Kreira novu matricu dimenzija predanih u parametrima, te trazi od korisnika
  420. //upis vrijednosti elemenata matrice sa tipkovnice.
  421. double** newFromSTDIN(int, int);
  422.  
  423.  
  424. //Ispisuje predanu matricu na ekran. Implementacija ove funkcije vam je
  425. //zadana u matrix.c, kako bi ispisi bili u obliku koji grader ocekuje.
  426. void matrixPrint(double**, int rows, int cols);
  427.  
  428. //Oslobadja zauzetu memoriju predane matrice.
  429. void  matrixDelete(double**, int rows, int cols);
  430.  
  431. //Obavlja mnozenje dvije matrice, te vraca novu matricu u kojoj se nalazi
  432. //rezultat. Mnozenje je matricno, pa je potrebno ovisno o dimenzijama predanih
  433. //matrica odrediti dimenzije matrice koju ce funkcija vratiti. Ukoliko su
  434. //dimenzije predanih matrica takve da se matricno mnozenje ne moze izvrsiti,
  435. //potrebno je vratiti NULL vrijednost.
  436. double** matrixMultiply(double** M1, int r1, int c1, double** M2, int r2, int c2);
  437.  
  438. //Obavlja mnozenje dvije matrice na nacin da se mnoze medjusobno elementi na
  439. //istim mjestima. To znaci da ce se mnoziti element na (1,1) sa elementom na
  440. //(1,1) itd. Vratiti rezultantnu matricu. Dimenzije matrica moraju
  441. //biti jednake
  442. double** matrixElementwiseMultiply(double** M1, double** M2, int rows, int columns);  
  443.  
  444.  
  445. //Obavlja zbrajanje dvije matrice na nacin da se zbrajaju medjusobno elementi na
  446. //istim mjestima. To znaci da ce se zbrajati element na (1,1) sa elementom na
  447. //(1,1) itd. Vratiti rezultantnu matricu. Dimenzije matrica moraju
  448. //biti jednake
  449. double** matrixAdd(double** M1, double** M2, int rows, int columns);
  450.                    
  451.                    
  452. //Obavlja oduzimanje dvije matrice na nacin da se oduzimaju medjusobno elementi
  453. //na istim mjestima. To znaci da ce se od elementa na (1,1) oduzeti vrijednost
  454. //elementa na (1,1).  Vratiti rezultantnu matricu. Dimenzije matrica moraju
  455. //biti jednake
  456. double** matrixSubtract(double** M1, double** M2, int rows, int columns);
  457.  
  458.  
  459. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement