Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct _matrix {
- int size; //number of elements
- int ord; //order of matrix
- int* val;
- int* col;
- int* row;
- } matrix;
- matrix fill_matrix (int ord)
- {
- int i, j, size = ord * ord / 3;
- matrix new_matrix;
- new_matrix.val = malloc(sizeof(int) * size);
- new_matrix.row = malloc(sizeof(int) * size);
- new_matrix.col = malloc(sizeof(int) * size);
- new_matrix.ord = ord;
- new_matrix.size = size;
- j = 1;
- for (i = 0; i < size; i++) {
- new_matrix.val[i] = rand() % 9 + 1;
- new_matrix.col[i] = rand() % j + 1;
- new_matrix.row[i] = rand() % j + 1;
- j++;
- }
- printf("\n=====array:=====\n");
- for (i = 0; i < size; i++) printf("%d ", new_matrix.val[i]);
- printf("\n");
- for (i = 0; i < size; i++) printf("%d ", new_matrix.row[i]);
- printf("\n");
- for (i = 0; i < size; i++) printf("%d ", new_matrix.col[i]);
- return new_matrix;
- }
- void print_matrix (matrix m)
- {
- int i, j, k, flag, ord = m.ord, size = m.size;
- for (i = 1; i <= ord; i++) {
- for (j = 1; j <= ord; j++) {
- flag = 0;
- for (k = 0; k < size; k++) {
- if (m.row[k] == i && m.col[k] == j){
- flag = 1;
- printf("%d ", m.val[k]);
- break;
- }
- }
- if (flag == 0) printf(". ");
- }
- printf("\n");
- }
- }
- matrix transpose (matrix m)
- {
- int i, size = m.size, ord = m.ord;
- matrix mt;
- mt.val = malloc(sizeof(int) * size);
- mt.row = malloc(sizeof(int) * size);
- mt.col = malloc(sizeof(int) * size);
- mt.ord = ord;
- mt.size = size;
- for (i = 0; i < size; i++) {
- mt.val[i] = m.val[i];
- mt.row[i] = m.col[i];
- mt.col[i] = m.row[i];
- }
- return mt;
- }
- matrix mul (matrix A, matrix B)
- {
- 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;
- matrix BT;
- BT = transpose(B);
- printf("\n-----mtxBT-----\n");
- print_matrix(BT);
- matrix R;
- R.val = malloc(sizeof(int) * size);
- R.row = malloc(sizeof(int) * size);
- R.col = malloc(sizeof(int) * size);
- R.ord = ord;
- R.size = size;
- for (a = 1; a <= ord; a++) {
- //printf(" a=%d\n", a);
- for (b = 1; b <= ord; b++) {
- //printf(" b=%d\n", b);
- sum = 0;
- for (i = 0; i < size; i++) {
- curr_row_a = a;
- curr_row_b = b;
- curr_col_b = A.col[i];
- if (A.row[i] == a) {
- for(j = 0; j < size; j++) {
- if (BT.col[j] == curr_col_b && BT.row[j] == curr_row_b) {
- sum += A.val[i] * BT.val[j];
- r_col = BT.col[j];
- break;
- }
- }
- }
- }
- if (0 != sum) {
- //printf("%d\n", sum);
- R.val[r] = sum;
- R.row[r] = a;
- R.col[r] = b;
- r++;
- }
- }
- }
- printf("\n=====array:=====\n");
- for (i = 0; i < size; i++) printf("%d ", R.val[i]);
- printf("\n");
- for (i = 0; i < size; i++) printf("%d ", R.row[i]);
- printf("\n");
- for (i = 0; i < size; i++) printf("%d ", R.col[i]);
- return R;
- }
- int main()
- {
- matrix A, B, C;
- int n = 3;
- printf("insert order:");
- scanf("%d", &n);
- A = fill_matrix(n);
- B = fill_matrix(n);
- printf("\n-----mtrxA-----\n");
- print_matrix(A);
- //printf("\n-----mtrxB-----\n");
- //print_matrix(B);
- C = mul(A, B);
- printf("\n-----mtrxC-----\n");
- print_matrix(C);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement