社区
C语言
帖子详情
请各位前辈帮忙解决一下用C语言编译增广矩阵的算法,急,谢谢!
mystergirl19876120
2005-07-11 12:55:43
需要一个用C语言编译增广矩阵的算法
...全文
398
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
语言
实现线性方程组的高斯消元法
最后,我们编写一个主函数,通过输入系数矩阵和常数向量,调用gaussElimination函数进行高斯消元法计算,然后调用backSubstitution函数进行逆向代入法求解线性方程组的解析解。线性方程组是高等数学中常见的数学模型,解方程组的方法有很多,其中高斯消元法是一种较为普遍和常用的方法。在计算机编程中,我们可以使用
C
语言
来实现高斯消元法,快速地求解线性方程组的解析解。最后,我们可以将上述代码
编译
运行,并输入线性方程组的系数矩阵和常数向量,求解其解析解。
C
语言
实现线性方程组的高斯消元法。
椭球拟合(用于磁传感器,
编译
环境keil5)
利用
C
语言
去实现椭球拟合利用到了高斯消元法,高斯消元法五个步骤为构建
增广矩阵
、主元选取、消元操作、主元归一化、回代求解。3、消元操作:用主元所在行的倍数加到后续行上,使得主元所在列的下方元素变为零。5、回代求解:从最后一行开始,依次回代求解未知数的值。4、主元归一化:将每个主元所在行的首位系数变为1,可以通过将主元所在行除以主元素的值来实现。2、主元选取:选择当前列中绝对值最大的元素作为主元素(或者根据某种其他规则进行主元选取)。1、构建
增广矩阵
:将线性方程组的系数矩阵和常数向量按行合并构成
增广矩阵
。
视觉SLAM十四讲笔记 -- 第一讲
第一讲:课后习题 有线性方程 Ax = b,若已知 A,b,需要求解x,该如何求解? 这对 A 和 b 有哪些要求? 【提示:从A的维度和秩角度来分析】 答:可以利用大学时候学的非齐次方程组的方法求解,利用 A 的
增广矩阵
,对
增广矩阵
进行标准化和归一化。 A的
增广矩阵
是: rank(A)<rank(A~) , 方程组 (2) 无解 rank(A)=rank(A~)=n , 方程组 (2) 有唯一解 rank(A)=rank(A~)<n , 方程组 (2) 有无穷解 rank
c
语言
中这么找中秋位数,大家中秋快乐 小弟想求一
算法
这是在Visual C++6.0环境下编写的,如果要在Turbo C中运行,可要自己多改几下,否则会不知道如何用哦!#include#include#define N 100#define TOTEL 1e-6void main( ){int i,j,k,n;double a[N][N],sum,t;printf("
请
输入系数矩阵的阶数:");scanf("%d",&n);printf("...
【项目二】基于Qt平台的线性代数运算工具
前言Linear Algebra Terminator 基于去年编写的
C
语言
代码向C++进行迭代,其中迭代了3个版本,不过都是在控制台上完成的,对用户输入不太友好,其中的矩阵对象主要是依据自定义的Fraction(分数)对象实现的,缺乏多样性,本次Linear Algebra Terminator - version 4.0 基于Qt平台开发,保留了原版本指令模式输入,同时添加了可视化输入和修改的模式,以及将原本的矩阵对象改为了类模板来实现多态。...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章