C矩阵算法包

矩阵算法包

简单的矩阵算法包,包括矩阵的加减法,转置矩阵,逆矩阵,数乘矩阵算法。使用C语言设计,使用二维数组储存矩阵。
写法非常简单,便于新手理解。我也只是抛砖引玉。

void memu();菜单函数
void Plus();加法函数
void Subtract();减法函数
void Multiplicate();数乘矩阵函数
void Transport() ;转置矩阵
void ReTransport() ;逆矩阵

#include<stdio.h>
#include<windows.h>
#define M 20 
#define N 20
double A[M][N];
double B[M][N];
double C[M][N];
int i,j,m,n,p,q;
double y=1.0;
void memu();
void Plus();
void Subtract();
void Multiplicate();
void Transport() ;
void ReTransport() ;
void MultiplicateC() ;

//主函数
int main()
{
	
	int x;
	while(true)
	{
		memu();
		printf("\t\t>>>请选择1--6:");
		scanf("%d",&x);
		switch (x)
		{
			case 1: system("cls");
				     Plus();    //两个矩阵相加
			         break;   
			case 2:	system("cls");
			        Subtract();  //两个矩阵相减
			        break; 
			case 3:	system("cls");
			        Multiplicate() ; //数乘矩阵 
			        break; 
    		case 4:	system("cls");
			        Transport();    //转置矩阵
			        break; 
			case 5: system("cls");
			        ReTransport();  //逆矩阵
			        break; 
//			case 6: system("cls");
//			        MultiplicateC(); // 矩阵的上乘常数 
//			        break; 
			case 7: return 0;
			        break;
			default: printf("\n-----选择错误,请重试-------\n");
		         	 break;
			
		}
	}
	printf("-------次感谢您使用本系统------------");
	printf("\n");
	printf("******************************************************************\n");
}
void memu()
{
    printf("\t\t======================================================\n");
    printf("\t\t||          欢迎您使用矩阵函数包系统                ||\n");
    printf("\t\t||          *********************************       ||\n");
    printf("\t\t||          *           功能菜单          *         ||\n");
    printf("\t\t||          *********************************       ||\n");
    printf("\t\t||                  1.矩阵相加                      ||\n");
	printf("\t\t||                  2.矩阵相减                      ||\n");
    printf("\t\t||                  3.数乘矩阵                      ||\n");
    printf("\t\t||                  4.矩阵转置                      ||\n");
    printf("\t\t||                  5.逆矩阵                        ||\n");
//	printf("\t\t||                  6.矩阵的乘常数                  ||\n");
	printf("\t\t||                  7.退出                          ||\n");
	printf("\t\t||        *********************************         ||\n");
    printf("\t\t||                                                  ||\n");
    printf("\t\t======================================================\n");
}
//两个矩阵相加
void Plus()
{
	printf("请输入矩阵A的行数和列数(用空格隔开):");
	scanf("%d %d",&i,&j);
	printf("请输入矩阵B的行数和列数(用空格隔开):") ;
	scanf("%d %d",&m,&n);
	if(i!=m||j!=n)
	    printf("您输入的两个矩阵不能相加,j!=m,请重试.....\n");
	else 
		printf("请输入矩阵A:\n"); 
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	scanf("%lf",&A[p][q]);
	printf("输出矩阵A:\n");
	for(p=0;p<i;p++)

	for(q=0;q<j;q++)
	{ 
		printf("%10.2f",A[p][q]);
		if((q+1)%j==0)
		printf("\n"); 
	}
	printf("请输入矩阵B:\n");
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	scanf("%lf",&B[p][q]);

	printf("输出矩阵B:\n");
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	{ 
		printf("%10.2f",B[p][q]);
		if((q+1)%j==0)
		printf("\n"); 
	}
	printf("矩阵A+矩阵B为:\n"); //计算两个矩阵相加
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	C[p][q]=A[p][q]+B[p][q];
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	{
		printf("%10.2f",C[p][q]);
		if((q+1)%j==0)
		printf("\n");
	}
}

//两个矩阵相减
void Subtract() 
{
	printf("请输入矩阵A的行数和列数(用空格隔开):");
	scanf("%d %d",&i,&j);
	printf("请输入矩阵B的行数和列数(用空格隔开):") ;
	scanf("%d %d",&m,&n);
	if(i!=m||j!=n) 
		printf("您输入的两个矩阵不能相加,j!=m,请重试.....\n");
	else printf("请输入矩阵A:\n"); 
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	scanf("%lf",&A[p][q]);
	printf("输出矩阵A:\n");
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	{ 
		printf("%10.2f",A[p][q]);
		if((q+1)%j==0)
			printf("\n"); 
	}
	printf("请输入矩阵B:\n");
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	scanf("%lf",&B[p][q]);
	printf("输出第矩阵B:\n");
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	{ 
		printf("%10.2f",B[p][q]);
		if((q+1)%j==0)
			printf("\n"); 
	}
	printf("矩阵A-矩阵B为:\n"); //计算两个矩阵相减
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	C[p][q]=A[p][q]-B[p][q];
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	{
		printf("%10.2f",C[p][q]);
		if((q+1)%j==0)
			printf("\n");
	}

}

//数乘矩阵
void Multiplicate()  
{
	double k; 
	printf("请输入矩阵A的行数和列数(用空格隔开):");
	scanf("%d %d",&i,&j);
	printf("请输入矩阵A\n"); 
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	scanf("%lf",&A[p][q]);
	printf("输出矩阵A\n");
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	{ 
		printf("%10.2f",A[p][q]);
		if((q+1)%j==0)
			printf("\n"); 
	} 
	printf("请输入一个实数:\n");
	scanf("%lf",&k);
	for(p=0;p<i;p++) //数乘矩阵
        for(q=0;q<j;q++)
        	B[p][q]=k*A[p][q];
        printf("输出k乘矩阵A的结果\n");
        for(p=0;p<i;p++)
        for(q=0;q<j;q++)
        { 
            printf("%10.2f",B[p][q]);
            if((q+1)%j==0)
                printf("\n"); 
     	}

}

//转置矩阵
void Transport()    
{
    printf("请输入矩阵A的行数和列数(用空格隔开):");
	scanf("%d %d",&i,&j);
	printf("请输入矩阵A:\n");
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	scanf("%lf",&A[p][q]);
	printf("输出矩阵A\n");
	for(p=0;p<i;p++)
	for(q=0;q<j;q++)
	{ 
		printf("%10.2f",A[p][q]);
		if((q+1)%j==0)
			printf("\n"); 
	}
	for(p=0;p<i;p++) //转置
	for(q=0;q<j;q++)
	B[q][p]=A[p][q];
	printf("输出矩阵A的转置矩阵:\n");
	for(p=0;p<j;p++)
	for(q=0;q<i;q++)
	{ 
		printf("%10.2f",B[p][q]);
		if((q+1)%i==0)
			printf("\n");
	}
}

//逆矩阵
void ReTransport() 
{
	double a[M][2*M]; 
	double b[N][2*N]; 
	double t,x; 
	int k,T; 
	printf("输入方阵的维数:\n"); //请输入方阵,即行和列相等的矩阵。
	scanf("%d",&T);
	printf("请输入矩阵:\n");
	for(i=0;i<T;i++) 
	for (j=0;j<T;j++) 
	scanf("%lf",&b[i][j]); 
	printf("原矩阵为:\n"); 
	for (i=0;i<T;i++) 
	{ 
		for (j=0;j<T;j++) 
		printf("%10.3f",b[i][j]); 
		printf("\n"); 
	}
	for(i=0;i<T;i++) 
	for(j=0;j<(2*T);j++) 
	{ 
		if (j<T) 
			a[i][j]=b[i][j]; 
		else if (j==T+i) 
			a[i][j]=1.0; 
		else 
			a[i][j]=0.0; 
	}
	for(i=0;i<T;i++)
	{
		for(k=0;k<T;k++)
		{ 
			if(k!=i)
			{ 
				t=a[k][i]/a[i][i];
				for(j=0;j<(2*T);j++)
				{ 
					x=a[i][j]*t;
					a[k][j]=a[k][j]-x;
				}
			}
		}
	}
	for(i=0;i<T;i++)
	{ 
		t=a[i][i];
		for(j=0;j<(2*T);j++)
		a[i][j]=a[i][j]/t;
	}
	for(i=0;i<T;i++) 
	y=y*a[i][i];
	if(y==0)
		printf("对不起,您输入的矩阵没有逆矩阵,请重新输入。\n");
	else 
	{
		for(i=0;i<T;i++) 
		for(j=0;j<T;j++)
		b[i][j]=a[i][j+T];
		printf("逆矩阵为:\n"); 
		for (i=0;i<T;i++) 
		{ 
			for (j=0;j<T;j++) 
			printf("%10.3f",b[i][j]); 
			printf("\n"); 
		} 
	}

}

//矩阵的乘常数 
//void  MultiplicateC() 
//{
//     double a[50][50], m;
//     int row,line; 
//     printf("请输入常数");
//     scanf("%lf",&m);
//	 printf("请输入矩阵的行数和列数(用空格隔开):");
//	 scanf("%d %d",&row,&line);
//	 printf("请输入矩阵");
//	 for(int i=0;i<row;i++)
//	 {
//	 	for(int j=0;j<line;j++)
//	 	 scanf("%lf",&a[i][j]);
//	 }
//	 for(int i=0;i<row;i++)
//	 {
//	 	for(int j=0;j<line;j++)
//	 	 {
//	 	 	printf("%.2lf ",a[i][j]*m);
//		 }
//		printf("\n");
//	 }
//	 
//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值