| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2669 人关注过本帖
标题:C语言编写矩阵乘法函数,怎么使用动态内存分配?
只看楼主 加入收藏
leizhanzhi
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-5-31
结帖率:33.33%
收藏
已结贴  问题点数:15 回复次数:8 
C语言编写矩阵乘法函数,怎么使用动态内存分配?
想要编写一个可以调用的函数,能实现矩阵的乘法,矩阵的维数不固定,但是可以通过传参传入函数中,传入的参数中包括一个存放结果的矩阵,我使用了宏定义函数编写矩阵乘法,如果不想使用宏定义函数的话,该怎么写?遇到的问题是在定义函数参数时,矩阵的维数不能确定,不知道要怎么处理,动态内存分配也不太清楚应该在何处使用,请前辈指点。
这是我写的宏定义函数实现的矩阵乘法
程序代码:
#include <stdio.h>
#define MATRIX_PRINT(mtx)         matrix_print( sizeof(mtx)/sizeof(*(mtx)), sizeof(*(mtx))/sizeof(**(mtx)), (mtx) )
#define MATRIX_MUT(a,b,c)         matrix_mut(sizeof(a)/sizeof(*(a)),sizeof(*(a))/sizeof(**(a)),sizeof(*(b))/sizeof(**(b)),(a),(b),(c))

void matrix_print( size_t row, size_t col, float mtx[row][col] )
{
    size_t r=0,c=0;
    for(  r=0; r<row; r++)
    {
        for(  c=0; c<col; c++ )
        {
           printf( "%f ", mtx[r][c]);
        }
    }
}

void matrix_mut(size_t row,size_t med,size_t col,float a[row][med],float b[med][col],float c[row][col])
{
  size_t i,j,l;
  for(i=0;i<row;i++)
  {
      for(j=0;j<col;j++)
      {
          float sum=0;
          for(l=0;l<med;l++)
          {
              sum=sum+a[i][l]*b[l][j];
          }
          c[i][j]=sum;
      }
  }
}
int main( void )
{
    float a[2][3] = { {1,2,3}, {1,5,2} };
    float b[3][2]={1,2,2,1,3,1};
    float d[2][2];
    MATRIX_MUT(a,b,d);
    MATRIX_PRINT( d );
    return 0;
}
搜索更多相关主题的帖子: row 函数 矩阵 sizeof float 
2020-06-20 19:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:5 
矩阵的维数不固定

矩阵不都是二维的吗?你真的是维数不固定,还是每维的长度不固定?

当然,不管是哪种,你都可以用一维数组去存放。
比如一个3维矩阵,每维长度分别是 6,7,8。
用多维数组那么定义为 type mtx1[6][7][8]
用一维数组那么定义为 type mtx2[6*7*8]
mtx1[a][b][c] 其实就是 mtx2[ a*7*8 + b*8 + c ]
2020-06-20 22:18
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:5 
二维矩阵:
矩阵A元素数确定,行数确定,则列数=元素数/行数;
矩阵B元素数确定,行数=矩阵A列数,列数=元素数/行数;
结果矩阵=动态分配内存矩阵A行数*矩阵B列数

是这个?

[此贴子已经被作者于2020-6-20 23:48编辑过]


梦想拥有一台龙芯3A-4000
2020-06-20 23:47
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:570
专家分:3727
注 册:2019-7-29
收藏
得分:5 
程序代码:
#include <stdio.h>
#include <stdlib.h>

void matrix_print(int row, int col, float** mtx);
void matrix_mut(int row_a, int col_a, int col_b, float** a, float** b, float** c);

void matrix_print(int row, int col, float** mtx)
{
    int r = 0, c = 0;
    for (r = 0; r < row; r++)
    {
        for (c = 0; c < col; c++)
        {
            printf("%g ", *(*(mtx + r) + c));
        }
        printf("\n");
    }
}

void matrix_mut(int row_a, int col_a, int col_b, float** a, float** b, float** c)
{
    int i, j, k;
    for (i = 0; i < row_a; i++)
    {
        for (j = 0; j < col_b; j++)
        {
            float sum = 0;
            for (k = 0; k < col_a; k++)
            {
                sum += *(*(a + i) + k) * *(*(b + k) + j);
            }
            *(*(c + i) + j) = sum;
        }
    }
}
int main(void)
{
    int i, j;
    float** a, ** b, ** c;
    int row_a, col_a, row_b, col_b;

    printf("请输入矩阵A的行数,列数:\n");
    scanf("%d,%d", &row_a, &col_a);
    a = (float**)malloc(row_a * sizeof(float*));
    for (i = 0; i < row_a; i++)
        a[i] = (float*)malloc(col_a * sizeof(float));
    printf("请输入矩阵A:\n");
    for (i = 0; i < row_a; i++)
        for (j = 0; j < col_a; j++)
            scanf("%f", &a[i][j]);

    row_b = col_a;
    printf("请输入矩阵B的列数:\n");
    scanf("%d", &col_b);
    b = (float**)malloc(row_b * sizeof(float*));
    for (i = 0; i < row_b; i++)
        b[i] = (float*)malloc(col_b * sizeof(float));
    printf("请输入矩阵B:\n");
    for (i = 0; i < row_b; i++)
        for (j = 0; j < col_b; j++)
            scanf("%f", &b[i][j]);

    c = (float**)calloc(row_a, sizeof(float*));
    for (i = 0; i < row_a; i++)
        c[i] = (float*)calloc(col_b, sizeof(float));


    //    float a[2][3] = {{1,2,3}, {1,5,2}};
    //    float b[3][2]= {{1,2},{2,1},{3,1}};
    //    float d[2][2];

    matrix_mut(row_a, col_a, col_b, a, b, c);
    matrix_print(row_a, col_b, c);

    for (i = 0; i < row_a; i++)
        free(*(a + i));
    free(a);

    for (i = 0; i < row_b; i++)
        free(*(b + i));
    free(b);

    for (i = 0; i < row_a; i++)
        free(*(c + i));
    free(c);

    return 0;
}

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-06-21 10:00
leizhanzhi
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-5-31
收藏
得分:0 
回复 2楼 rjsp
是的,我描述错了,是二维矩阵的行数和列数不确定
2020-06-21 10:02
leizhanzhi
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-5-31
收藏
得分:0 
回复 3楼 ditg
我想表达的就是,函数能够计算矩阵A和矩阵B的乘法,保存在C矩阵中,矩阵A的列数和矩阵B的行数相同,矩阵A和矩阵B在函数中是不确定的,只有在主函数中给出了才能确定两个矩阵的行数和列数,我想表达的就是这个意思
2020-06-21 10:08
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
“遇到的问题是在定义函数参数时,矩阵的维数不能确定,不知道要怎么处理” & “矩阵A的列数和矩阵B的行数相同,矩阵A和矩阵B在函数中是不确定的”

矩阵A和矩阵B到底确定吗?如果确定,只是维数不确定,最笨蛋的方法就全域搜索一下。比如你给的题目矩阵A6个元素,矩阵B6个元素,则可行解为1*6 & 6*1、2*3 & 3*2、3*2 & 2*3、6*1 & 1*6。

梦想拥有一台龙芯3A-4000
2020-06-21 11:17
leizhanzhi
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-5-31
收藏
得分:0 
回复 7楼 ditg
在主函数中已经知道矩阵的行数和列数还有元素值,不需要用键盘输入,在主函数中计算多个矩阵的相乘,比如说计算4*6的矩阵和6*6的矩阵的乘法,还要计算2*3和3*4 4*4和4*4的矩阵的乘法,想把矩阵乘法的过程写成一个函数,10阶以内矩阵乘法都能计算,可以在主函数中直接调用,不在主函数中写多个矩阵乘法的过程;
2020-06-21 12:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 8楼 leizhanzhi
听不懂,你把 main 函数的代码贴出来
2020-06-22 09:02
快速回复:C语言编写矩阵乘法函数,怎么使用动态内存分配?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033183 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved