Advertisement
allekco

Strasse

Jun 5th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.43 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <math.h>
  7. #include <stddef.h>
  8. #include <time.h>
  9.  
  10. typedef struct Matrix{
  11.     int ncolumns;
  12.     int nrows;
  13.     int **c;
  14. } Matrix;
  15.  
  16. int randomazer (int min, int max){
  17.     int random;
  18.     random = rand();
  19.     random = ((float)random / RAND_MAX)*(max-min)+min;
  20.     return(random);
  21. }
  22.  
  23. Matrix create (int n, int min, int max){
  24.     Matrix A;
  25.     int i=0,j=0;
  26.     if (( A.c = malloc ( n * sizeof ( int *))) == NULL )
  27.         exit (1);
  28.     for (i = 0; i < n ; i++ ) {
  29.         if (( A.c[i] = malloc ( n * sizeof ( int ))) == NULL )
  30.             exit (2);
  31.     }
  32.     for (i = 0; i < n; i++){
  33.         for ( j = 0; j < n; j++){
  34.             A.c [i][j] = randomazer(min, max);
  35.         }
  36.     }
  37.     A.nrows = n;
  38.     A.ncolumns = n;
  39.     return A;
  40. }
  41.  
  42. Matrix sum (Matrix A, Matrix B){
  43.     Matrix n;
  44.     n = create (A.nrows, 0, 0);
  45.     int i=0, j=0;
  46.     for (i=0; i<A.nrows; i++){
  47.         for ( j=0; j<A.ncolumns; j++){
  48.             n.c[i][j]=A.c[i][j]+B.c[i][j];
  49.         }
  50.     }
  51.     n.nrows;
  52.     n.ncolumns;
  53.     return n;
  54. }
  55.  
  56. Matrix subtr (Matrix A, Matrix B){
  57.     Matrix n;
  58.     n = create (A.nrows, 0, 0);
  59.     int i=0, j=0;
  60.     for (i=0; i<A.nrows; i++){
  61.         for ( j=0; j<A.ncolumns; j++){
  62.             n.c[i][j]=A.c[i][j]-B.c[i][j];
  63.         }
  64.     }
  65.     n.nrows;
  66.     n.ncolumns;
  67.     return n;
  68. }
  69.  
  70. Matrix half1 (Matrix A){
  71.     Matrix A11;
  72.     int i, j;
  73.     A11 = create (A.ncolumns/2, 0, 0);
  74.     for (i = 0; i < A.ncolumns/2; i++){
  75.         for (j = 0; j < A.ncolumns/2; j++){
  76.             A11.c[i][j] = A.c[i][j];       
  77.         }
  78.     }
  79.     return A11;
  80. }
  81.  
  82. Matrix half2 (Matrix A){
  83.     Matrix A12;
  84.     int i, j;
  85.     A12 = create (A.ncolumns/2, 0, 0);
  86.     for (i = 0; i < A.ncolumns/2; i++){
  87.         for (j = 0; j < A.ncolumns/2; j++){
  88.             A12.c[i][j] = A.c[i][j+A.ncolumns/2];      
  89.         }
  90.     }
  91.     return A12;
  92. }
  93.  
  94. Matrix half3 (Matrix A){
  95.     Matrix A21;
  96.     int i, j;
  97.     A21 = create (A.ncolumns/2, 0, 0);
  98.     for (i = 0; i < A.ncolumns/2; i++){
  99.         for (j = 0; j < A.ncolumns/2; j++){
  100.             A21.c[i][j] = A.c[i+A.ncolumns/2][j];      
  101.         }
  102.     }
  103.     return A21;
  104. }
  105.  
  106. Matrix half4 (Matrix A){
  107.     Matrix A22;
  108.     int i, j;
  109.     A22 = create (A.ncolumns/2, 0, 0);
  110.     for (i = 0; i < A.ncolumns/2; i++){
  111.         for (j = 0; j < A.ncolumns/2; j++){
  112.             A22.c[i][j] = A.c[i+A.ncolumns/2][j+A.ncolumns/2];     
  113.         }
  114.     }
  115.     return A22;
  116. }
  117.  
  118. void output (Matrix A){
  119.     int i=0, j=0;
  120.     for (i=0; i<A.nrows; i++){
  121.         for ( j=0; j<A.ncolumns; j++){
  122.             printf ("%d ", A.c [i][j]);
  123.         }
  124.     printf (" \n" );
  125.     }
  126.     printf ("\n");
  127. }
  128.  
  129. void delete_mass (Matrix A){
  130.     int i=0;
  131.     for (i = 0; i < A.nrows ; i++ )
  132.     free(A.c[i]) ;
  133.     free (A.c);
  134. }
  135.  
  136. Matrix simple_multiply (Matrix A, Matrix B){
  137.         Matrix c;
  138.         c = create (A.ncolumns, 0, 0);
  139.         c.c [0][0] = A.c [0][0] * B.c [0][0] + A.c [0][1] * B.c [1][0];
  140.         c.c [1][0] = A.c [1][0] * B.c [0][0] + A.c [1][1] * B.c [1][0];
  141.         c.c [0][1] = A.c [0][0] * B.c [0][1] + A.c [0][1] * B.c [1][1];
  142.         c.c [1][1] = A.c [1][0] * B.c [0][1] + A.c [1][1] * B.c [1][1];
  143.         return c;  
  144. }
  145.  
  146. Matrix connect (Matrix C11, Matrix C12, Matrix C21, Matrix C22){
  147.     Matrix C;
  148.     C = create (C11.ncolumns*2, 0, 0);
  149.     int i, j;
  150.     for (i = 0; i < C11.ncolumns; i++){
  151.         for (j = 0; j < C11.ncolumns; j++){
  152.             C.c[i][j] = C11.c[i][j];
  153.         }
  154.     }
  155.     printf ("%d\n", C11.ncolumns/2);
  156.     for (i = 0; i < C11.ncolumns; i++){
  157.         for (j = C11.ncolumns; j < C.ncolumns; j++){
  158.             C.c[i][j] = C12.c[i][j-C11.ncolumns];
  159.         }
  160.     }
  161.     for (i = C11.ncolumns; i < C.ncolumns; i++){
  162.         for (j = 0; j < C11.ncolumns; j++ ){
  163.             C.c[i][j] = C21.c[i - C11.ncolumns][j];
  164.         }
  165.     }
  166.     for (i = C11.ncolumns; i < C.ncolumns; i++){
  167.         for (j = C11.ncolumns; j < C.ncolumns; j++ ){
  168.             C.c[i][j] = C22.c[i-C11.ncolumns][j-C11.ncolumns];
  169.         }
  170.     }  
  171.     return C;
  172. }
  173.  
  174. Matrix mult (Matrix A, Matrix B){
  175.     if (A.ncolumns == 2){
  176.         Matrix c;
  177.         c = simple_multiply (A, B);
  178.         return c;
  179.     }
  180.     else{
  181.         Matrix A11;
  182.         Matrix A12;
  183.         Matrix A21;
  184.         Matrix A22;
  185.         Matrix B11;
  186.         Matrix B12;
  187.         Matrix B21;
  188.         Matrix B22;
  189.         A11 = half1 (A);
  190.         A12 = half2 (A);
  191.         A21 = half3 (A);
  192.         A22 = half4 (A);
  193.         B11 = half1 (B);
  194.         B12 = half2 (B);
  195.         B21 = half3 (B);
  196.         B22 = half4 (B);
  197.         Matrix P1;
  198.         Matrix P2;
  199.         Matrix P3;
  200.         Matrix P4;
  201.         Matrix P5;
  202.         Matrix P6;
  203.         Matrix P7;
  204.         Matrix X1;
  205.         Matrix X2;
  206.         X1 = sum (A11, A22);
  207.         X2 = sum (B11, B22);
  208.         P1 = mult (X1, X2);
  209.         delete_mass(X1);
  210.         delete_mass(X2);
  211.         Matrix X3;
  212.         X3 = sum (A21, A22);
  213.         P2 = mult (X3, B11);
  214.         delete_mass(X3);
  215.         Matrix X4;
  216.         X4 = subtr (B12, B22);
  217.         P3 = mult (A11, X4);
  218.         delete_mass(X4);
  219.         Matrix X5;
  220.         X5 = subtr (B21, B11);
  221.         P4 = mult (A22, X5);
  222.         delete_mass(X5);
  223.         Matrix X6;
  224.         X6 = sum (A11, A12);
  225.         P5 = mult (X6, B22);
  226.         delete_mass(X6);
  227.         Matrix X7;
  228.         Matrix X8;
  229.         X7 = subtr (A21, A11);
  230.         X8 = sum (B11, B12);
  231.         P6 = mult (X7, X8);
  232.         delete_mass(X7);
  233.         delete_mass(X8);
  234.         Matrix X9;
  235.         Matrix X10;
  236.         X9 = subtr (A12, A22);
  237.         X10 = sum (B21, B22);
  238.         P7 = mult (X9, X10);
  239.         Matrix C11;
  240.         Matrix C12;
  241.         Matrix C21;
  242.         Matrix C22;
  243.         Matrix C;
  244.         Matrix tmp1;
  245.         Matrix tmp2;
  246.         Matrix tmp3;
  247.         Matrix tmp4;
  248.         tmp1 = sum (P1, P4);
  249.         tmp2 = subtr (tmp1, P5);
  250.         C11 = sum (tmp2, P7);
  251.         C12 = sum (P3, P5);
  252.         C21 = sum (P2, P4);
  253.         tmp3 = subtr (P1, P2);
  254.         tmp4 = sum (tmp3, P3);
  255.         C22 = sum (tmp4, P6);  
  256.         delete_mass(tmp1); 
  257.         delete_mass(tmp2);
  258.         delete_mass(tmp3);
  259.         delete_mass(tmp4);
  260.        
  261.         C = connect (C11, C12, C21, C22);
  262.        
  263.         return C;  
  264.     }
  265. }
  266.  
  267. int main (void) {
  268.     srand(time(NULL));
  269.     Matrix A;
  270.     Matrix B;
  271.     Matrix D;
  272.     int n = 4;
  273.     A = create (n, 0, 10);
  274.     B = create (n, 0, 10);
  275.     output (A);
  276.     output (B);
  277.     D = mult (A, B);
  278.     output (D);
  279.  
  280.     return 0;
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement