Advertisement
Ladies_Man

sparse matrix multiplication

Jan 26th, 2015
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.85 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct _matrix {
  5.     int size;       //number of elements
  6.     int ord;       //order of matrix
  7.     int* val;
  8.     int* col;
  9.     int* row;
  10. } matrix;
  11.  
  12. matrix fill_matrix (int ord)
  13. {
  14.     int i, j, size = ord * ord / 3;
  15.     matrix new_matrix;
  16.  
  17.     new_matrix.val = malloc(sizeof(int) * size);
  18.     new_matrix.row = malloc(sizeof(int) * size);
  19.     new_matrix.col = malloc(sizeof(int) * size);
  20.     new_matrix.ord = ord;
  21.     new_matrix.size = size;
  22.  
  23.     j = 1;
  24.     for (i = 0; i < size; i++) {
  25.         new_matrix.val[i] = rand() % 9 + 1;
  26.         new_matrix.col[i] = rand() % j + 1;
  27.         new_matrix.row[i] = rand() % j + 1;
  28.         j++;
  29.     }
  30.     printf("\n=====array:=====\n");
  31.     for (i = 0; i < size; i++) printf("%d ", new_matrix.val[i]);
  32.     printf("\n");
  33.     for (i = 0; i < size; i++) printf("%d ", new_matrix.row[i]);
  34.     printf("\n");
  35.     for (i = 0; i < size; i++) printf("%d ", new_matrix.col[i]);
  36.  
  37.     return new_matrix;
  38. }
  39.  
  40. void print_matrix (matrix m)
  41. {
  42.     int i, j, k, flag, ord = m.ord, size = m.size;
  43.  
  44.     for (i = 1; i <= ord; i++) {
  45.         for (j = 1; j <= ord; j++) {
  46.             flag = 0;
  47.             for (k = 0; k < size; k++) {
  48.                 if (m.row[k] == i && m.col[k] == j){
  49.                     flag = 1;
  50.                     printf("%d ", m.val[k]);
  51.                     break;
  52.                 }
  53.             }
  54.             if (flag == 0) printf(". ");
  55.         }
  56.         printf("\n");
  57.     }
  58. }
  59.  
  60. matrix transpose (matrix m)
  61. {
  62.     int i, size = m.size, ord = m.ord;
  63.     matrix mt;
  64.  
  65.     mt.val = malloc(sizeof(int) * size);
  66.     mt.row = malloc(sizeof(int) * size);
  67.     mt.col = malloc(sizeof(int) * size);
  68.     mt.ord = ord;
  69.     mt.size = size;
  70.  
  71.     for (i = 0; i < size; i++) {
  72.         mt.val[i] = m.val[i];
  73.         mt.row[i] = m.col[i];
  74.         mt.col[i] = m.row[i];
  75.     }
  76.     return mt;
  77. }
  78.  
  79. matrix mul (matrix A, matrix B)
  80. {
  81.     int i, j, k, a, b, r = 0, curr_row_a, curr_row_b, curr_col_b, r_col, sum = 0, size = A.size, ord = A.ord;
  82.  
  83.     matrix BT;
  84.     BT = transpose(B);
  85.     printf("\n-----mtxBT-----\n");
  86.     print_matrix(BT);
  87.  
  88.     matrix R;
  89.     R.val = malloc(sizeof(int) * size);
  90.     R.row = malloc(sizeof(int) * size);
  91.     R.col = malloc(sizeof(int) * size);
  92.     R.ord = ord;
  93.     R.size = size;
  94.  
  95.     for (a = 1; a <= ord; a++) {
  96.         //printf(" a=%d\n", a);
  97.         for (b = 1; b <= ord; b++) {
  98.             //printf("  b=%d\n", b);
  99.             sum = 0;
  100.             for (i = 0; i < size; i++) {
  101.                 curr_row_a = a;
  102.                 curr_row_b = b;
  103.                 curr_col_b = A.col[i];
  104.                 if (A.row[i] == a) {
  105.                     for(j = 0; j < size; j++) {
  106.                         if (BT.col[j] == curr_col_b && BT.row[j] == curr_row_b) {
  107.                             sum += A.val[i] * BT.val[j];
  108.                             r_col = BT.col[j];
  109.                             break;
  110.                         }
  111.                     }
  112.                 }
  113.             }
  114.             if (0 != sum) {
  115.                 //printf("%d\n", sum);
  116.                 R.val[r] = sum;
  117.                 R.row[r] = a;
  118.                 R.col[r] = b;
  119.                 r++;
  120.             }
  121.         }
  122.     }
  123.     printf("\n=====array:=====\n");
  124.     for (i = 0; i < size; i++) printf("%d ", R.val[i]);
  125.     printf("\n");
  126.     for (i = 0; i < size; i++) printf("%d  ", R.row[i]);
  127.     printf("\n");
  128.     for (i = 0; i < size; i++) printf("%d  ", R.col[i]);
  129.  
  130.     return R;
  131. }
  132.  
  133. int main()
  134. {
  135.     matrix A, B, C;
  136.     int n = 3;
  137.     printf("insert order:");
  138.     scanf("%d", &n);
  139.     A = fill_matrix(n);
  140.     B = fill_matrix(n);
  141.  
  142.     printf("\n-----mtrxA-----\n");
  143.     print_matrix(A);
  144.  
  145.     //printf("\n-----mtrxB-----\n");
  146.     //print_matrix(B);
  147.  
  148.  
  149.     C = mul(A, B);
  150.  
  151.     printf("\n-----mtrxC-----\n");
  152.     print_matrix(C);
  153.  
  154.     return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement