умножение матриц с использованием mallo c без ввода пользователя - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь использовать функцию Mallo c для динамического выделения памяти, но я также хочу указать свой ввод данных для операции, а не принимать пользовательский ввод. Я нашел этот код здесь, который отлично работает, но я работаю с большим набором данных, и пользовательский ввод не вариант, поэтому я хочу продолжать использовать MALLO C, но также определить набор данных.

как вместо того, чтобы следовать,

//Input Matrix1
    for (i = 0; i < r1; i++)
        for (j = 0; j < c1; j++)
           scanf_s("%d", &mat1[i][j]); 

Я хочу, чтобы что-то вроде

//mat1[2][2] = { {1,2},{2,3} } было вставлено в коде

Как бы это было сделать это? Буду очень признателен за советы. Спасибо

#include<stdio.h>
#include<stdlib.h>


int main() {
    int **mat1, **mat2, **res, i, j,k, r1, c1, r2, c2;

    printf("\nEnter the Order of the First matrix...\n");
    scanf_s("%d %d", &r1, &c1);
    printf("\nEnter the Order of the Second matrix...\n");
    scanf_s("%d %d", &r2, &c2);

    if (c1 != r2) {
        printf("Invalid Order of matrix");
        exit(EXIT_SUCCESS);
    }

    mat1 = (int**)malloc(r1 * sizeof(int*));

    for (i = 0; i < c1; i++)
        mat1[i] = (int*)malloc(c1 * sizeof(int));

    mat2 = (int**)malloc(r2 * sizeof(int*));

    for (i = 0; i < c2; i++)
        mat2[i] = (int*)malloc(c2 * sizeof(int));

    res = (int**)calloc(r1, sizeof(int*));

    for (i = 0; i < c2; i++)
        res[i] = (int*)calloc(c2, sizeof(int));

    /**/
    //Input Matrix1
    for (i = 0; i < r1; i++)
        for (j = 0; j < c1; j++)
            scanf_s("%d", &mat1[i][j]);
    //Input Matrix2
    for (i = 0; i < r2; i++)
        for (j = 0; j < c2; j++)
            scanf_s("%d", &mat2[i][j]);

    //Printing Input Matrix 1 and 2

    printf("\n Entered Matrix 1: \n");
    for (i = 0; i < r1; i++) {
        for (j = 0; j < c1; j++)
            printf("%d ", mat1[i][j]);
        printf("\n");
    }

    printf("\n Entered Matrix 2: \n");
    for (i = 0; i < r2; i++) {
        for (j = 0; j < c2; j++)
            printf("%d ", mat2[i][j]);
        printf("\n");
    }

    //int mat1[2][2] = { {1,2},{2,3} };
    //int mat2[2][2] = { {1,3},{2,4} };
    //Computation


    //Multiplication

    for (i = 0; i < r1; i++) {
        for (j = 0; j < c2; j++) {
            res[i][j] = 0;
            for (k = 0; k < c1; k++)
                res[i][j] += mat1[i][k] * mat2[k][j];

        }
        printf("\n");
    }


    printf("\nThe Multiplication of two matrix is\n");
    for (i = 0; i < r1; i++) {
        printf("\n");
        for (j = 0; j < c2; j++)
            printf("%d\t", res[i][j]);
    }
    printf("\n");

    /*  Addition
    for(i=0;i<r1;i++)
            for(j=0;j<c2;j++)
                    res[i][j]=mat1[i][j]+mat2[i][j];


    printf("\nThe Addition of two matrix is\n");
       for(i=0;i<r1;i++){
           printf("\n");
           for(j=0;j<c2;j++)
                printf("%d\t",res[i][j]);
        }
    */


    return 0;
}

1 Ответ

0 голосов
/ 11 марта 2020

Пожалуйста, укажите формат ваших входных данных. Это CSV-файл?

Вы можете указывать данные в формате int b[4] = {1, 2, 3, 4} только тогда, когда размер b фиксирован, т.е. известен во время компиляции. Но если все ваши матрицы известны во время компиляции, зачем вам делать динамическое выделение c?

Также я немного очистил ваш код:

#include <stdio.h>                                                                                                                                            
#include <stdlib.h>                                                                                                                                           
#include <string.h>                                                                                                                                           

#define index(x, y, r) (x+r*y)                                                                                                                                

struct matrix {
        int cols;
        int rows;
        double * data;
};

void print_mat(struct matrix * mat) {
        int i, j;
        for (i = 0; i < mat->rows; i++) {
                for (j = 0; j < mat->cols; j++) {
                        printf("%f \t", mat->data[index(i, j, mat->rows)]);
                }
                printf("\n");
        }
}

int mat_alloc(struct matrix *mat) {
        mat->data = (double*)malloc(mat->rows*mat->cols*sizeof(double));
}

int read_mat(struct matrix *mat) {
        int i, j;
        for (i = 0; i < mat->rows; i++) {
                for (j = 0; j < mat->cols; j++) {
                        scanf("%lf", &(mat->data[index(i, j, mat->rows)]));
                }
        }
}

int multiply(struct matrix * a, struct matrix * b, struct matrix * res) {
        if(a->cols != b->rows){
                printf("Matrix dimensions do not match!\n");
                return 0;
        }
        res->rows = a->rows;
        res->cols = b->cols;
        mat_alloc(res);
        memset(res->data, 0, res->cols*res->rows*sizeof(double));
        int i, j, k;
        for (i = 0; i < res->rows; i++) {
                for (j = 0; j < res->cols; j++) {
                        for (k = 0; k < a->cols; k++) {
                                res->data[index(i, j, res->rows)] += a->data[index(i, k, a->rows)] * b->data[index(k, j, b->rows)];
                        }
                }
        }
}

int main() {                                                                                         
    struct matrix mat1, mat2, res;                                                                   

    printf("\nEnter the Order of the First matrix...\n");                                            
    scanf("%d %d", &mat1.rows, &mat1.cols);                                                          
    printf("\nEnter the Order of the Second matrix...\n");                                           
    scanf("%d %d", &mat2.rows, &mat2.cols);                                                          

    mat_alloc(&mat1);                                                                                
    mat_alloc(&mat2);                                                                                

    read_mat(&mat1);                                                                                 
    read_mat(&mat2);                                                                                 

    printf("Scanned matrices: \n");                                                                  
    print_mat(&mat1);                                                                                
    printf("\n");                                                                                    
    print_mat(&mat2);                                                                                
    printf("\n");                                                                                    

    multiply(&mat1, &mat2, &res);                                                                    

    printf("Calculated result: \n");                                                                 
    print_mat(&res);                                                                                 

    return 0;                                                                                        
}       
...