【问题标题】:matrix multiplication using malloc without user input使用 malloc 的矩阵乘法,无需用户输入
【发布时间】:2020-06-22 22:19:07
【问题描述】:

我正在尝试使用 Malloc 函数来动态分配内存,但我也想指定我的数据条目以进行操作,而不是获取用户输入。 我发现这个代码在这里工作得很好,但是我正在处理一个大型数据集并且接受用户输入不是一个选项,所以我想继续使用 MALLOC 并定义数据集。

喜欢而不是关注,

//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;
}

【问题讨论】:

    标签: matrix malloc multiplication


    【解决方案1】:

    请指定输入数据的格式。是csv文件吗?

    b 的大小是固定的,即在编译时已知时,您只能以int b[4] = {1, 2, 3, 4} 格式指定数据。但是,如果你所有的矩阵在编译时都是已知的,为什么还要麻烦做动态分配呢?

    我还稍微清理了你的代码:

    #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;                                                                                        
    }       
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2016-02-22
      • 2021-05-02
      • 2016-10-31
      • 2017-04-02
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多