标题:[原创]GaussJordan消去法(C语言版)
只看楼主
苦味酸
Rank: 2
等 级:新手上路
威 望:3
帖 子:142
专家分:0
注 册:2005-9-9
 问题点数:0 回复次数:7 
[原创]GaussJordan消去法(C语言版)

56sONIAW.rar (226.38 KB) [原创]GaussJordan消去法(C语言版)


这是我今天上午帮同学做的一个小作业,拿出来交流交流。
可以直接下载源代码

搜索更多相关主题的帖子: C语言 GaussJordan 源代码 消去法 
2006-05-29 13:18
苦味酸
Rank: 2
等 级:新手上路
威 望:3
帖 子:142
专家分:0
注 册:2005-9-9
得分:0 

怎么都是只下载不说话呢?大家可以随便谈谈自己的想法噻

下面这是源代码:

#include "stdafx.h"
#include "iostream.h"
#include "malloc.h"

int Row=0,Col=0;//矩阵总行数,总列数

double * InitMatrix()
{
double * matrix;
cout<<" 请输入矩阵维数(行,列):"<<endl;
cin>>Row>>Col;
matrix = (double*)malloc(Row*Col*sizeof(double));
double * Elem;
Elem = matrix;
cout<<" 请依次输入行列元素值:"<<endl;
for(int i=0;i<Row;i++)
{
for(int j=0;j<Col;j++)
{
cout<<" mat("<<i<<","<<j<<")=";
cin>>*Elem;
Elem++;
}
}
return matrix;
}

double GetElem(double * mat,int m,int n)
{
double *Elem = mat;
int i=0;
while(i<(m*Col+n))
{
Elem++;
i++;
}
return *Elem;
}

void SetElem(double * mat,int m,int n,double v)
{
double *Elem = mat;
int i=0;
while(i<(m*Col+n))
{
Elem++;
i++;
}
*Elem = v;
}

bool GaussJordan(double * mat)
{
if(1 != (Col-Row))
return false;
int i = 0,j = 0,k = 0;//行标,列标,第几轮计算
double L_ik = 1;
double L_kk = 1;//Elem(k,k)的倒数
double matElem = 0;

for(k = 0;k < Row;k++)
{
if(0 == GetElem(mat,k,k))
return false;
L_kk = 1/GetElem(mat,k,k);
for(i = 0;i < Row;i++)
{
if(i == k)
continue;
L_ik = GetElem(mat,i,k)*L_kk;
for(j = k+1;j < Col;j++)
{
matElem = GetElem(mat,i,j) - L_ik * GetElem(mat,k,j);
SetElem(mat,i,j,matElem);
}
}
//计算主行
for(j = k;j < Col;j++)
{
matElem = L_kk * GetElem(mat,k,j);
SetElem(mat,k,j,matElem);
}
}
//构造结果解矩阵
cout<<"计算结果如下:"<<endl;
for(i = 0;i < Row;i++)
{
cout<<"\t"<<GetElem(mat,i,Row);
}
return true;
}

int main(int argc, char* argv[])
{
double * mat = InitMatrix();
if(!GaussJordan(mat))
{
cout<<"错误!"<<endl;
}
cout<<endl;
return 0;
}


『站在风口浪尖紧握住鼠标旋转!』 『不在于选择什么,而在于坚持多久!』
2006-05-29 23:33
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
C++,我回答不上~

淘宝杜琨
2006-05-30 01:01
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
楼主标题似应为
[原创]GaussJordan消去法(C++版)
不夸奖,你不高兴;夸奖你,有点违心!
不觉得下列代码可笑吗?
int i=0;
while(i<(m*Col+n))
{
Elem++;
i++;
}
不管你信不信,以上几行可用
Elem+=m*Col+n;
一步到位

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-30 08:14
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 

//是否涛声依旧?
#include "stdafx.h"
#include "iostream.h"
#include "malloc.h"

int Row=0,Col=0;//矩阵总行数,总列数

double * InitMatrix()
{
double * matrix;
cout<<" 请输入矩阵维数(行,列):"<<endl;
cin>>Row>>Col;
matrix = (double*)malloc(Row*Col*sizeof(double));
double * Elem;
Elem = matrix;
cout<<" 请依次输入行列元素值:"<<endl;
for(int i=0;i<Row;i++)
{
for(int j=0;j<Col;j++)
{
cout<<" mat("<<i<<","<<j<<")=";
cin>>*Elem;
Elem++;
}
}
return matrix;
}

double GetElem(double * mat,int m,int n)
{
return mat[m*Col+n];
}

void SetElem(double * mat,int m,int n,double v)
{
mat[m*Col+n] = v;
}

bool GaussJordan(double * mat)
{
if(1 != (Col-Row))
return false;
int i = 0,j = 0,k = 0;//行标,列标,第几轮计算
double L_ik = 1;
double L_kk = 1;//Elem(k,k)的倒数
double matElem = 0;

for(k = 0;k < Row;k++)
{
if(0 == GetElem(mat,k,k))
return false;
L_kk = 1/GetElem(mat,k,k);
for(i = 0;i < Row;i++)
{
if(i == k)
continue;
L_ik = GetElem(mat,i,k)*L_kk;
for(j = k+1;j < Col;j++)
{
matElem = GetElem(mat,i,j) - L_ik * GetElem(mat,k,j);
SetElem(mat,i,j,matElem);
}
}
//计算主行
for(j = k;j < Col;j++)
{
matElem = L_kk * GetElem(mat,k,j);
SetElem(mat,k,j,matElem);
}
}
//构造结果解矩阵
cout<<"计算结果如下:"<<endl;
for(i = 0;i < Row;i++)
{
cout<<"\t"<<GetElem(mat,i,Row);
}
return true;
}

int main(int argc, char* argv[])
{
double * mat = InitMatrix();
if(!GaussJordan(mat))
{
cout<<"错误!"<<endl;
}
cout<<endl;
return 0;
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-30 08:42
苦味酸
Rank: 2
等 级:新手上路
威 望:3
帖 子:142
专家分:0
注 册:2005-9-9
得分:0 
能者为师,谢谢兄台指点

你说的很有道理,我也清楚自己写的代码很烂
拿出来交流,不也就是想听听高人的指点嘛

当时我确实没想到可以这么做
Elem+=m*Col+n;
真心谢谢兄台的指点
虽然我以前也象你说的那么做过,毕竟认识不够深,你这么一说当然印象更深刻了


『站在风口浪尖紧握住鼠标旋转!』 『不在于选择什么,而在于坚持多久!』
2006-05-30 23:36
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
回复:(苦味酸)能者为师,谢谢兄台指点
难得有您这么听得进逆耳忠言(据我观察多数人受不得批评更受不了委屈)。如果不介意,建议
⑴去掉参数Col的输入,因为它必须等于Row+1
⑵完全屏蔽掉C++语法,用纯粹的C
⑶升级为全主元高斯——约当消元法
这一步较难做到:
升级为C++下的复数版,即求解复系数方程组。
复数四则运算要求通过运算符重载机制来实现。

事实上电路理论中的矩阵代数多半是复系数的。

追求更高更快更强的编程,就是菜鸟→高手的过程。


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-31 03:47
stellar_yang
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2009-11-6
得分:0 
C++
2009-11-10 11:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-68211-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.052113 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved