社区
C语言
帖子详情
请各位前辈帮忙解决一下用C语言编译增广矩阵的算法,急,谢谢!
mystergirl19876120
2005-07-11 12:55:43
需要一个用C语言编译增广矩阵的算法
...全文
478
5
打赏
收藏
请各位前辈帮忙解决一下用C语言编译增广矩阵的算法,急,谢谢!
需要一个用C语言编译增广矩阵的算法
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mystergirl19876120
2005-07-13
打赏
举报
回复
dirtysalt(李纳斯) 前辈,厉害咯,谢谢!
dirtysalt
2005-07-12
打赏
举报
回复
/*算法目的:将矩阵化简为阶梯矩阵,并将阶梯矩阵转换为行标准矩阵*/
/*算法局限:仅对整数元素计算,输出可以为浮点数*/
/*操作:输入数组大小,格式:m,n如5,6*/
/*之后再输入内容*/
/*说明:笔者英文水平不高,阶梯矩阵译为step_matrix*/
/*行标准矩阵译为standard matrix*/
/*author:dirtysalt,date:05.7.12,time:22:00*/
#include <stdio.h>
#include <malloc.h>
double **a;
int m,n;
int check_x,check_x_temp;/*在转换为阶梯矩阵时用,在变为行标准矩阵时有特殊用途*/
/*check_x检查矩阵首位非零元的位置*/
/*如果非零元不在首行,则需要调换行*/
/*此时check_x_temp所记录的便是起始行*/
int check_y,check_y_temp;/*与check_x和check_x_temp同理*/
void malloc_matrix()
/*开辟矩阵二维空间*/
{
int i;
printf("Please input the m x n\n");
scanf("%d,%d",&m,&n);
a=(double**)malloc(sizeof(double *)*m);
for(i=0;i<m;i++)
a[i]=(double*)malloc(sizeof(double)*n);
}
void get_matrix()
/*输入矩阵*/
{
int i,j;
int x;
for(i=0;i<m;i++)
{
printf("Please input the row:%d\n",i+1);
for(j=0;j<n;j++)
{
printf("%d:",j+1);
scanf("%d",&x);
a[i][j]=(double)x;
}
}
}
void display_matrix()
/*显示矩阵*/
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%f ",a[i][j]);
printf("\n");
}
}
void free_matrix()
/*释放空间*/
{
int i;
for(i=0;i<m;i++)
free(a[i]);
free(a);
}
void init_calc()
/*初始化变量,在每次进行矩阵计算前均要执行*/
{
m=0;
n=0;
check_x=0;
check_x_temp=0;
check_y=0;
check_y_temp=0;
}
int check_zero_matrix()
/*检查是否为零矩阵或者不能够再化简*/
{
int i,j;
check_x=check_x_temp;
check_y=check_y_temp;
if((check_x>=m)||(check_y>=n))
return 1;
for(j=check_y;j<n;j++)
{
for(i=check_x;i<m;i++)
{
if(a[i][j]!=0)
{
check_x=i;/*记录下当前非零的位置*/
check_y=j;
return 0;
}
}
}
return 1;
}
void pre_exchange()
/*在每次化简前需要预处理,将首位非零元放在起始行*/
{
int i,j;
if(check_x!=check_x_temp);
{
for(j=0;j<n;j++)
{
double temp;
temp=a[check_x][j];
a[check_x][j]=a[check_x_temp][j];
a[check_x_temp][j]=temp;
}
check_x=check_x_temp;
}
check_x_temp++;/*放在起始行后便可以只考虑下一行和下一列了*/
check_y_temp++;
}
void change_to_step_matrix()
/*化简矩阵的函数,无非就是将check_y列的check_x行下所有的元素置零*/
{
int i,j;
double temp;
if((check_x+1>=m)||(check_y>=m))
return ;
for(i=check_x+1;i<m;i++)
{
temp=a[i][check_y]/a[check_x][check_y];
for(j=check_y;j<n;j++)
a[i][j]-=temp*a[check_x][j];
}
}
void step_to_standard_matrix()
/*阶梯矩阵转换为行标准矩阵*/
{
int i,j,i_temp,j_temp;
double temp;
check_y=0;
for(i=m-1;i>=0;i--)
{
for(j=0;j<n;j++)
{
if(a[i][j]!=0)
break;
}
check_y=j;/*check_y用来保存i行首个非零元的位置*/
temp=1/a[i][j];
for(j=check_y;j<n;j++)
a[i][j]*=temp;
for(i_temp=0;i_temp<i;i_temp++)
{
temp=a[i_temp][check_y]/a[i][check_y];
for(j_temp=0;j_temp<n;j_temp++)
a[i_temp][j_temp]-=temp*a[i][j_temp];
}
}
}
int main(int argc, char *argv[])
{
init_calc();
malloc_matrix();
get_matrix();
while(check_zero_matrix()==0)
{
pre_exchange();
change_to_step_matrix();
}
printf("Step Matrix:\n");
display_matrix();
printf("\n\n\n");
printf("Standard Matrix:\n");
step_to_standard_matrix();
display_matrix();
free_matrix();
getchar();
return 0;
}
dirtysalt
2005-07-12
打赏
举报
回复
前天写了个矩阵化简为阶梯矩阵程序,由阶梯矩阵转换为标准行矩阵的程序不难实现
这样可以解决增广矩阵的问题
希望这个程序对您有帮助
/*算法目的:将矩阵化简为阶梯矩阵*/
/*算法局限:仅对整数元素计算,输出可以为浮点数*/
/*操作:输入数组大小,格式:m,n如5,6*/
/*之后再输入内容*/
/*author:dirtysalt,date:05.7.11,time:0:09*/
#include <stdio.h>
#include <malloc.h>
double **a;
int m,n;
int check_x,check_x_temp;/*check_x检查矩阵首位非零元的位置*/
/*如果非零元不在首行,则需要调换行*/
/*此时check_x_temp所记录的便是起始行*/
int check_y,check_y_temp;/*与check_x和check_x_temp同理*/
void malloc_matrix()
/*开辟矩阵二维空间*/
{
int i;
printf("Please input the m x n\n");
scanf("%d,%d",&m,&n);
a=(double**)malloc(sizeof(double *)*m);
for(i=0;i<m;i++)
a[i]=(double*)malloc(sizeof(double)*n);
}
void get_matrix()
/*输入矩阵*/
{
int i,j;
int x;
for(i=0;i<m;i++)
{
printf("Please input the row:%d\n",i+1);
for(j=0;j<n;j++)
{
printf("%d:",j+1);
scanf("%d",&x);
a[i][j]=(double)x;
}
}
}
void display_matrix()
/*显示矩阵*/
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%g ",a[i][j]);
printf("\n");
}
}
void free_matrix()
/*释放空间*/
{
int i;
for(i=0;i<m;i++)
free(a[i]);
free(a);
}
void init_calc()
/*初始化变量,在每次进行矩阵计算前均要执行*/
{
m=0;
n=0;
check_x=0;
check_x_temp=0;
check_y=0;
check_y_temp=0;
}
int check_zero_matrix()
/*检查是否为零矩阵或者不能够再化简*/
{
int i,j;
check_x=check_x_temp;
check_y=check_y_temp;
if((check_x>=m)||(check_y>=n))
return 1;
for(j=check_y;j<n;j++)
{
for(i=check_x;i<m;i++)
{
if(a[i][j]!=0)
{
check_x=i;/*记录下当前非零的位置*/
check_y=j;
return 0;
}
}
}
return 1;
}
void pre_exchange()
/*在每次化简前需要预处理,将首位非零元放在起始行*/
{
int i,j;
if(check_x!=check_x_temp);
{
for(j=0;j<n;j++)
{
double temp;
temp=a[check_x][j];
a[check_x][j]=a[check_x_temp][j];
a[check_x_temp][j]=temp;
}
check_x=check_x_temp;
}
check_x_temp++;/*放在起始行后便可以只考虑下一行和下一列了*/
check_y_temp++;
}
void simply_matrix()
/*化简矩阵的函数,无非就是将check_y列的check_x行下所有的元素置零*/
{
int i,j;
double temp;
if((check_x+1>=m)||(check_y>=m))
return ;
for(i=check_x+1;i<m;i++)
{
temp=a[i][check_y]/a[check_x][check_y];
for(j=check_y;j<n;j++)
a[i][j]-=temp*a[check_x][j];
}
}
int main(int argc, char *argv[])
{
init_calc();
malloc_matrix();
get_matrix();
while(check_zero_matrix()==0)
{
pre_exchange();
simply_matrix();
}
display_matrix();
free_matrix();
getchar();
return 0;
}
mystergirl19876120
2005-07-11
打赏
举报
回复
你的这个网址是什么呀
Willpro
2005-07-11
打赏
举报
回复
www.mark.com
c
语言
增广矩阵
变换程序,~~化简
增广矩阵
~~怎么出现错误!!求助
~~化简
增广矩阵
~~怎么出现错误!!求助
急
!!!化简
增广矩阵
~~怎么出现错误!!求助高手以下是程序>不知道什么地方出错了#include#define M 2#define N 2main(){ float a[M][N],b[N],c[M][N+1];int i,j,k;printf("
请
输入系数矩阵:\n");for(i=0;ifor(j=0;jscanf("%f",&a[i][j])...
C
语言
求解线性方程组AX=b
线性代数的一个核心问题就是线性方程组的求解问题,包括:解的存在性(是否有解),解的唯一性(有解,是无穷解还是唯一解)。通常将线性方程组写成AX=b的形式,其中,A为系数矩阵,X为未知数(向量的形式),b表示目标向量,举例如下: 求解上述线性方程组,常采用高斯消元法,将AX=b写成
增广矩阵
的形式,采用初等行变化得到上三角矩阵,从而判断,方程组解的存在性以及是否为唯一解。 根据
C
语言
求矩阵的逆(高斯法)
C
语言
,利用高斯消去法求矩阵的逆
增广矩阵
: 史上最通俗易懂的讲解!!
⎩⎨⎧xyz100x2y60y2z80110121102∣∣∣1006080A∣ba11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn∣∣∣∣b1b2⋮bm这样的表示方法让线性方程组的求解变得更加直观和系统。
C
语言
经典
算法
之高斯消元法
高斯消元法是一种求解线性方程组的数值方法,通过一系列初等行变换将系数矩阵化简为阶梯形矩阵(或上三角矩阵),进而通过回代得到方程组的解。
C语言
70,037
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章