请各位前辈帮忙解决一下用C语言编译增广矩阵的算法,急,谢谢!

mystergirl19876120 2005-07-11 12:55:43
需要一个用C语言编译增广矩阵的算法
...全文
398 5 打赏 收藏 转发到动态 举报
写回复
用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

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧