C语言矩阵运算

这篇博客介绍了C语言中矩阵运算的实现,包括矩阵的加法、乘法和转置。提供了详细的代码示例,展示了如何初始化、赋值、释放矩阵,并通过结构体封装矩阵操作。此外,还涵盖了矩阵加法、数乘运算的实例,帮助读者理解C语言编程中的矩阵操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

矩阵的乘法:

矩阵的列数(column)和第二个矩阵的行数(row)相同时

#include<stdio.h>
 int main()
{   int a[2][4], b[4][3], c[2][3];
    int i, j, k, sum; 
    printf("输入一个2×4的矩阵:\n"); 
    for(i=0;i<2;i++)                    //处理矩阵a中的一行中各元素
    	for(j=0;j<4;j++)               //处理矩阵a中某一列中各元素
			scanf("%d",&a[i][j]);   //输入数据
	printf("输入一个4×3的矩阵;\n"); 
	for(i=0;i<4;i++)                   //处理矩阵b中的一行中各元素
		for(j=0;j<3;j++)               //处理矩阵b中某一列中各元素
			scanf("%d",&b[i][j]);    //输入数据
	for(i=0;i<2;i++)                 //对矩阵c进行处理
	{	for(j=0;j<3;j++)             
		{	sum=0;
			for(k=0;k<4;k++)   //矩阵c中每一个元素的循环计算
			{   
			  sum+=a[i][k]*b[k][j]; //对矩阵c中的某一元素进行计算
			}
			c[i][j]=sum;           //给矩阵c中的某一元素进行赋值
		}	
	}
	printf("得到一个2×3的矩阵:\n");
	for(i=0;i<2;i++)            //输出矩阵c
	{
		for(j=0;j<3;j++)	 
 			printf("%5d",c[i][j]);
 		printf("\n");
		 }
}

矩阵运算:

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

double value[] = {1,2,3,4,5,6,7,8,9};
double value2[] = {9,8,7,6,5,4,3,2,1};

typedef struct 
{
	int row,line;		//line为行,row为列
	double *data;
}Matrix;

Matrix* InitMatrix(Matrix *matrix,int row,int line);		//初始化矩阵
void ValueMatrix(Matrix *matrix,double *array);				//给一个矩阵赋值
int SizeMatrix(Matrix *matrix);								//获得一个矩阵的大小
void FreeMatrix(Matrix *matrix);							//释放一个矩阵
void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B);		//复制一个矩阵的值
void PrintMatrix(Matrix *matrix);							//打印一个矩阵

//矩阵的基本运算
Matrix* AddMatrix(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的加法
Matrix* MulMatrix(Matrix *matrix_A,Matrix *matrix_B);		//矩阵的乘法
void TransMatrix(Matrix *matrix);			//条件为方阵

int main(int argc,char* argv[])
{
	Matrix *matrix1 = InitMatrix(matrix1,3,3);
	Matrix *matrix2 = InitMatrix(matrix2,3,3);

	ValueMatrix(matrix1,value);
	// CopyMatrix(matrix1,matrix2);	//复制赋值
	ValueMatrix(matrix2,value2);

	printf("矩阵1 乘以 矩阵2: \n");
	Matrix *matrix3 = MulMatrix(matrix1,matrix2);	//乘法
	PrintMatrix(matrix3);	
	printf("矩阵1 加上 矩阵2: \n");
	Matrix *matrix4 = AddMatrix(matrix1,matrix2);	//加法
	PrintMatrix(matrix4);
	printf("矩阵1进行转置: \n");
	TransMatrix(matrix1);					//转置
	PrintMatrix(matrix1);
	
	return 0;
}

Matrix* InitMatrix(Matrix *matrix,int row,int line)				//初始化一个矩阵
{
	if (row>0 && line>0)
	{
		matrix = (Matrix*)malloc(sizeof(Matrix));
		matrix->row = row;
		matrix->line = line;
		matrix->data = (double*)malloc(sizeof(double)*row*line);
		memset(matrix->data,0,sizeof(double)*row*line);
		return matrix;
	}
	else 
		return NULL;
} 

void ValueMatrix(Matrix *matrix,double *array) 		//给矩阵赋值
{
	if (matrix->data != NULL)
	{
		memcpy(matrix->data, array, matrix->row*matrix->line*sizeof(double));
	}
}

int SizeMatrix(Matrix *matrix)
{
	return matrix->row*matrix->line;
}

void FreeMatrix(Matrix *matrix)
{
	free(matrix->data);		//释放掉矩阵的data存储区
	matrix->data = NULL;
	printf("释放成功\n");
}

void CopyMatrix(Matrix *matrix_A, Matrix *matrix_B)
{
	matrix_B->row = matrix_A->row;
	matrix_B->line = matrix_A->line;
	memcpy(matrix_B->data, matrix_A->data, SizeMatrix(matrix_A)*sizeof(double));
}

void PrintMatrix(Matrix *matrix)
{
	for (int i=0;i<SizeMatrix(matrix);i++)
	{
		printf("%lf\t", matrix->data[i]);
		if ((i+1)%matrix->line == 0)
			printf("\n");
	}
			
}
//加法
Matrix* AddMatrix(Matrix *matrix_A,Matrix *matrix_B)
{
	if (matrix_A->row == matrix_B->row && matrix_A->line == matrix_B->line)
	{
		Matrix *matrix_C = InitMatrix(matrix_C,matrix_A->row,matrix_A->line);
		for (int i=0;i<matrix_A->line;i++)
		{
			for (int j=0;j<matrix_A->row;j++)
			{
				matrix_C->data[i*matrix_C->row + j] = \
				matrix_A->data[i*matrix_A->row + j] + matrix_B->data[i*matrix_A->row + j];
			}
		}
		return matrix_C;
	}
	else 
	{
		printf("不可相加\n");
		return NULL;
	}
}

//乘法
Matrix* MulMatrix(Matrix *matrix_A,Matrix *matrix_B)
{
	if (matrix_A->row == matrix_B->line)		//列==行
	{
		Matrix *matrix_C = InitMatrix(matrix_C,matrix_B->row,matrix_A->line);
		// matrix_C->line = matrix_A->line;		//A行
		// matrix_C->row = matrix_B->row;			//B列
		for (int i=0;i<matrix_A->row;i++)
		{
			for (int j=0;j<matrix_B->line;j++)
			{
				for (int k=0;k<matrix_A->line;k++)
				{
					matrix_C->data[i*matrix_C->line + j] += \
					matrix_A->data[i*matrix_A->line + k] * matrix_B->data[k*matrix_B->row + j];
				}
			}
		}
		return matrix_C;
	}
	else
	{
		printf("不可相乘\n");
		return NULL;
	}
}

//矩阵转置
void TransMatrix(Matrix *matrix)			//条件为方阵
{
	if (matrix->row == matrix->line)
	{
		Matrix *matrixTemp = InitMatrix(matrixTemp, matrix->row,matrix->line);       	//创建一个临时矩阵
		CopyMatrix(matrix,matrixTemp);	//将目标矩阵的data复制给临时矩阵

		for (int i=0;i<matrix->row;i++)
		{
			for (int j=0;j<matrix->line;j++)
			{
				matrix->data[i*matrix->row + j] = matrixTemp->data[j*matrix->row + i];
			}
		}
	}
	else
	{
		printf("转置的矩阵必须为方阵\n");
	}
}

矩阵加减、数乘运算例子:

/**
MatrixAddition.c
实现两个矩阵相加
*/
#include<stdio.h>
const int COLS=3;
void printMatirx(int *pArray,int rows,int cols);
void printMatirx2(int (*pArray)[COLS],int rows);
int main()
{
    int A[3][4]={{15,10,9,12},
                 {18,14,8,7},
                 {16,13,6,11}};
    printf("矩阵A=\n");
    printMatirx(A,3,4);
    int B[3][4]={{4,3,5,2},
                 {0,9,6,1},
                 {5,7,2,6}};
    printf("矩阵B=\n");
    printMatirx(B,3,4);
    int C[3][4];
 
    int i,j;
    //矩阵相加:两个矩阵必须行数和列数一样才能相加,
    //和矩阵的每个元素分别是两个矩阵对应的元素的和
    printf("矩阵A+矩阵B=\n");
    for(i=0;i<3;i++)//控制行
    {
        for(j=0;j<4;j++)
        {
            C[i][j]=A[i][j]+B[i][j];
//            printf("%3d",C[i][j]);//输出结果
        }
//        printf("\n");
    }
    int (*p)[COLS]=C;
    printMatirx2(p,3);
/*结果应为:
19 13 14 14
18 23 14  8
21 20  8 17
*/
    printf("矩阵C-矩阵A=\n");
    for(i=0;i<3;i++)//控制行
    {
        for(j=0;j<4;j++)
        {
 
            printf("%3d",C[i][j]-A[i][j]);//输出结果
        }
        printf("\n");
    }
    /*结果应为:
    4  3  5  2
    0  9  6  1
    5  7  2  6
    */
    //矩阵数乘:
    int D[3][4];
    printf("矩阵D:\n");
    for(i=0;i<3;i++)//控制行
    {
        for(j=0;j<4;j++)
        {
            D[i][j]=1;
            printf("%d\t", D[i][j]);//输出结果
        }
        printf("\n");
    }
    int mul;
    printf("矩阵D数乘以:");
    scanf("%d",&mul);
    printf("矩阵D数乘以%d=\n",mul);
    for(i=0;i<3;i++)//控制行
    {
        for(j=0;j<4;j++)
        {
            D[i][j]=D[i][j]*mul;
            printf("%d\t", D[i][j]);//输出结果
        }
        printf("\n");
    }
    return 0;
}
//使用一级指针来访问二维数组
void printMatirx(int *pArray,int rows,int cols)
{
    int i;
    int j;
    for(i=0;i<rows;i++)
    {
        for(j=0;j< cols;j++)
        {
            printf("%d\t",*(pArray+i*cols+j));
        }
        printf("\n");
    }
}
//使用指向一维数组的指针,访问二维数组
void printMatirx2(int (*pArray)[COLS],int rows)
{
    int i,j;
    for(i=0;i<rows;i++)
    {
        for(j=0;j<COLS;j++)
        {
            printf("%d\t",pArray[i][j]);
            /*
            []运算符的结合方向是由左向右,pArray[1][2]就等价于(* (pArray + 1))[2],
            而由于pArray是数组指针,而且数组的长度为3,
            所以* (pArray + 1):表示跨过3个元素,而也就是到array第二行
            即表示array[1]这个数组,则pArray[1][2]则就完全等价于array[1][2]。
            */
        }
        printf("\n");
    }
}

《C语言程序设计(第五版)谭浩强》学习笔记 | SiriBlog《C语言程序设计(第四版)谭浩强》学习笔记 1 程序设计和C语言1.4 最简单的C语言程序  C语言允许用两种注释方式:   (1)以//开始的单行注释。如上面介绍的注释。这种注释可以单独占一行,也可以出现在一行中其他内容的右侧。此种注释的范围从//开始,以换行符结束。也就是说这种注释不能跨行。如果注释内容一行内写不下,可以用多个单行注释,如下面两行是连续的icon-default.png?t=N7T8https://blog.siriyang.cn/posts/20200310191333id.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值