矩阵算法包
简单的矩阵算法包,包括矩阵的加减法,转置矩阵,逆矩阵,数乘矩阵算法。使用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");
// }
//
//}