计算机系统应用教程网站

网站首页 > 技术文章 正文

C|二维数组做函数参数求矩阵乘积 c二维数组作为函数参数

btikc 2024-10-12 10:50:30 技术文章 3 ℃ 0 评论

数据在内存中线性顺序按字节编址存储,不管几维数组,其实质都是一维,关键在于数组名(相当于一个常量指针)是首地址,由下标求出偏移量。但C是强类型语言,有类型匹配的问题。

以下用两个方法求矩阵乘积,从具体到一般:

#include <stdio.h>  // 二维数组做函数参数求矩阵乘积
                    // 矩阵(m*t) * 矩阵(t*n) = 矩阵(m*n)
void mutul(int a[][4],int b[][3], int c[][3],int m, int t, int n)
{
    int i,j,k;
    for(i=0; i<m; i++)            // 控制a、c 行
        for(j=0; j<n; j++)        // 控制b、c 列
        {
            c[i][j]=0;
            for(k=0; k<t; k++)    // 控制b 行、a 列
                c[i][j] += a[i][k]*b[k][j];
        }

    for(i=0; i<m; i++)            // 输出
    {
        for(j=0; j<n; j++)
            printf("%5d",c[i][j]);
        printf("\n");
    }
    printf("\n");
}

void mutul2(int a[],int b[], int c[], int m,int t,int n)//降维处理
{
    int i,j,s;
    for(i=0; i<m; i++)               // 控制a、c 行
        for(j=0; j<n; j++)           // 控制b、c 列
        {
            s=i*n+j;
            c[s]=0;
            for(int k=0; k<t; k++)   // 控制b 行、a 列
                c[s] += a[i*t+k] * b[k*n+j];
        }
    for(i=0;i<m; i++)                // 输出
    {
        for(j=0; j<n; j++)
            printf("%5d",c[i*n+j]);
        printf("\n");
    }
}
int main()
{
    int a[2][4] = { 1, 2, 3, 4,
                    5, 6, 7, 8 };

    int b[4][3] = { 1, 2, 3,
                    4, 5, 6,
                    7, 8, 9,
                    10,11,12 };
    int c[2][3] = {0};

    mutul(a,b,c,2,4,3);
    mutul2((int*)a,(int*)b,(int*)c,2,4,3);
    getchar();
    return 0;
}
/*
   70   80   90
  158  184  210

   70   80   90
  158  184  210
*/

-End-

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表