矩阵求逆 数值算法的算法怎么写

求逆算法的海词问答与网友补充:
求逆算法的相关资料:
相关词典网站:矩阵的求逆
最近做一个算法遇到需要计算矩阵的逆,闲着无聊,记录一下,以后免得再麻烦。
#include &stdio.h&
#include &math.h&
#include &string.h&
#define MAX 20
#define E 0.
* 计算矩阵src的模
double calculate_A( double src[][MAX], int n )
int i,j,k,x,y;
double tmp[MAX][MAX],
double result = 0.0;
if( n == 1 )
return src[0][0];
for( i = 0; i & ++i )
for( j = 0; j & n - 1; ++j )
for( k = 0; k & n - 1; ++k )
x = j + 1;
y = k &= i ? k + 1 :
tmp[j][k] = src[x][y];
t = calculate_A( tmp, n - 1 );
if( i % 2 == 0 )
result += src[0][i] *
result -= src[0][i] *
* 计算伴随矩阵
void calculate_A_adjoint( double src[MAX][MAX], double dst[MAX][MAX], int n )
int i, j, k, t, x,
double tmp[MAX][MAX];
if( n == 1 )
dst[0][0] = 1;
for( i = 0; i & ++i )
for( j = 0; j & ++j )
for( k = 0; k & n - 1; ++k )
for( t = 0; t & n - 1; ++t )
x = k &= i ? k + 1 :
y = t &= j ? t + 1 :
tmp[k][t] = src[x][y];
calculate_A( tmp, n - 1 );
if( ( i + j ) % 2 == 1 )
dst[j][i] = -1*dst[j][i];
* 得到逆矩阵
int calculate_A_inverse( double src[MAX][MAX], double dst[MAX][MAX], int n )
double A = calculate_A( src, n );
double tmp[MAX][MAX];
if ( fabs( A - 0 ) &= E )
printf(&不可能有逆矩阵!\n&);
calculate_A_adjoint( src, tmp, n );
for( i = 0; i & ++i )
for( j = 0; j & ++j )
dst[i][j] = (double)( tmp[i][j] / A );
* 输出矩形查看
void print_M( double M[][MAX], int n )
for ( i = 0; i & ++i )
for ( j = 0; j & ++j )
printf(&%lf &, M[i][j]);
printf(&\n&);
int main()
* 测试矩阵
double test[MAX][MAX], dst[MAX][MAX];
int n = 3;
* 构造最简单的:
memset( test, 0, sizeof( test ) );
test[0][0] = 1.0;
test[1][1] = 2.0;
test[2][2] = 5.0;
is_exist = calculate_A_inverse( test, dst, n );
if ( is_exist )
print_M(dst, n);
printf(&不存在!\n&);
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'矩阵求逆的算法
//*************************
//*** 求任何一个矩阵的逆***
//*************************
#include &math.h&
#include &malloc.h&
#include &iomanip.h&
#define& N&
&//定义方阵的最大阶数为10
//函数的声明部分
float MatDet(float *p, int n);&&
&//求矩阵的行列式
float Creat_M(float *p, int m, int n, int
&//求矩阵元素A(m, n)的代数余之式
void print(float *p, int n);&&
&//输出矩阵n*n
bool Gauss(float A[][N], float B[][N], int
&//采用部分主元的高斯消去法求方阵A的逆矩阵B
int main()
*buffer, *p;&&
&//定义数组首地址指针变量
&& &int row,
&//定义矩阵的行数和矩阵元素个数
&& &int i,
&//定义矩阵的行列式
a[N][N], b[N][N];
&& "采用逆矩阵的定义法求矩阵的逆矩阵!\n";
&& "请输入矩阵的行数: ";
&& &num = 2 *
&& &buffer =
(float *)calloc(num,
sizeof(float));&&
&//分配内存单元
&& &if (NULL !=
&for (i = 0; i & i++)
&cout && "Please
input the number of " && i+1
&& " row: ";
&for (j = 0; j & j++)
&cin && *p++;
&cout && "Can't
distribute memory\n";
&& "The original matrix : \n";
&print(buffer,
&//打印该矩阵
&& &determ =
MatDet(buffer, row);&&
&//求整个矩阵的行列式
&& &p = buffer +
&& &if (determ
&cout && "The
determinant of the matrix is " &&
&for (i = 0; i &
&//求逆矩阵
&for (j = 0; j & j++)
&*(p+j*row+i) = Creat_M(buffer, i, j,
&cout && "The
inverse matrix is: " &&
&//打印该矩阵
&cout && "The
determinant is 0, and there is no inverse matrix!\n";
&free(buffer);&&
&//释放内存空间
&& "采用部分主元的高斯消去法求方阵的逆矩阵!\n";
&& "请输入方阵的阶数: ";
&& "请输入"
"阶方阵: \n";
&//输入一个n阶方阵
&& &for (i = 0;
&for (j = 0; j & j++)
&//运用高斯消去法求该矩阵的逆矩阵并输出
&& &if (Gauss(a,
&cout && "该方阵的逆矩阵为:
&for (i = 0; i & i++)
&for (j = 0; j & j++)
&cout && b[i][j]
&& setw(10);
&& &return
//----------------------------------
//功能: 求矩阵(n*n)的行列式
//入口参数: 矩阵的首地址,矩阵的行数
//返回值: 矩阵的行列式值
//----------------------------------
float MatDet(float *p, int n)
&& &int r, c,
&& &int lop =
&& &float result
&& &float mid =
&& &if (n !=
&lop = (n == 2) ? 1 :
&//控制求和循环次数,若为2阶,则循环1次,否则为n次
&for (m = 0; m & m++)
&mid = 1;&&
&//顺序求和, 主对角线元素相乘之和
&for (r = 0, c = r & r++,
&mid = mid * (*(p+r*n+c%n));
&result +=
&for (m = 0; m & m++)
&mid = 1;&&
&//逆序相减, 减去次对角线元素乘积
&for (r = 0, c = n-1-m+n; r &
&mid = mid * (*(p+r*n+c%n));
&result -=
&result = *p;
&& &return
//------------------------------------------------------
//功能: 求k*k矩阵中元素A(m, n)的代数余之式
//入口参数: k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k
//返回值: k*k矩阵中元素A(m, n)的代数余之式
//-------------------------------------------------------
float Creat_M(float *p, int m, int n, int k)
&& &int i,
mid_result = 0;
&& &int sign =
*p_creat, *p_
(k-1)*(k-1);&&
&//k阶矩阵的代数余之式为k-1阶矩阵
&& &p_creat =
(float*)calloc(len, sizeof(float)); //分配内存单元
&& &p_mid =
&& &for (i = 0;
&for (j = 0; j & j++)
&if (i != m && j
!= n) //将除第i行和第j列外的所有元素存储到以p_mid为首地址的内存单元
&*p_mid++ = *(p+i*k+j);
&& &sign =
(m+n)%2 == 0 ? 1 : -1;&&
&//代数余之式前面的正、负号
&& &mid_result =
(float)sign*MatDet(p_creat, k-1);
&free(p_creat);
&& &return
//----------------------
//功能: 打印n*n矩阵
//入口参数: n*n矩阵的首地址,矩阵的行数n
//返回值: 无返回值
void print(float *p, int n)
&& &int i,
&& &for (i = 0;
&for (j = 0; j & j++)
setiosflags(ios::right) && *p++
&& setw(10);
//----------------------------------------------
//功能: 采用部分主元的高斯消去法求方阵A的逆矩阵B
//入口参数: 输入方阵,输出方阵,方阵阶数
//返回值: true or false
//----------------------------------------------
bool Gauss(float A[][N], float B[][N], int n)
&& &int i, j,
&& &float max,
t[N][N];&&
&//临时矩阵
&//将A矩阵存放在临时矩阵t[n][n]中
&& &for (i = 0;
i & i++)&&
&for (j = 0; j & j++)
&t[i][j] = A[i][j];
&//初始化B矩阵为单位阵
&& &for (i = 0;
i & i++)&&
&for (j = 0; j & j++)
&B[i][j] = (i == j) ? (float)1 : 0;
&& &for (i = 0;
&//寻找主元
&max = t[i][i];
&for (j = i+1; j & j++)
&if (fabs(t[j][i]) &
fabs(max))
&max = t[j][i];
&//如果主元所在行不是第i行,进行行交换
&if (k != i)
&for (j = 0; j & j++)
&temp = t[i][j];
&t[i][j] = t[k][j];
&t[k][j] =
&//B伴随交换
&temp = B[i][j];
&B[i][j] = B[k][j];
&B[k][j] =
&//判断主元是否为0, 若是, 则矩阵A不是满秩矩阵,不存在逆矩阵
&if (t[i][i] == 0)
&cout && "There is
no inverse matrix!";
&//消去A的第i列除去i行以外的各行元素
&temp = t[i][i];
&for (j = 0; j & j++)
&t[i][j] = t[i][j] /
&//主对角线上的元素变为1
&B[i][j] = B[i][j] /
&//伴随计算
&for (j = 0; j &
&//第0行-&第n行
&if (j != i)&&
&//不是第i行
&temp = t[j][i];
&for (k = 0; k &
&//第j行元素 - i行元素*j列i行元素
&t[j][k] = t[j][k] - t[i][k]*
&B[j][k] = B[j][k] - B[i][k]*
&& &return
测试结果:
采用逆矩阵的定义法求矩阵的逆矩阵!
请输入矩阵的行数:
Please input the number of
1 row: 1 0 2
Please input the number of
2 row: 0 2 1
Please input the number of
3 row: 3 1 2
The original matrix
The determinant of the
matrix is -9
The inverse matrix
-0.222222& 0.444444
-0.333333&
0.444444& 0.111111
采用部分主元的高斯消去法求方阵的逆矩阵!
请输入方阵的阶数:
请输入3阶方阵:
该方阵的逆矩阵为:
-1&&&&&&&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。大型矩阵快速求逆算法的研究_中华文本库
第1页/共30页
矩阵是高等代数的重要组成部分,是许多数学分支研究的重要工具。并且矩阵作为数学工具之一有其重要的使用价值,它常见于很多学科中,如:线性代数、线性规划、统计分析,以及组合数学等。在实际生活中,很多问题都可以借用矩阵抽象出来进行表述并进行运算,如在各循环赛中常用的赛况表格等,矩阵的概念和性质相对矩阵的运算较容易理解和掌握。在矩阵的运算和应用中,仅逆矩阵的求解方法及算法问题就值得我们去好好研究,尤其是对大型矩阵的逆矩阵的研究。近年来,随着互联网的高速发展,计算机内部的运算量也急剧增加,如何把浩瀚的数据准确地计算出结果,并且加快它的计算速度,己成为一个备受关注的研究课题。随着计算机应用领域的发展,逆矩阵运算的需求越来越大。现阶段大型逆矩阵运算都是由软件实现,如Matlab等数学软件。逆矩阵运算软件的普及,将使计算机的逆矩阵运算性能得到几何级数的提高。伴随矩阵作、初等变换等算法作为逆矩阵运算的一个重要组成部分,对其研究的意义也就很大。
我们所做的研究方向,仅是利用Matlab数学软件和我们所学到的求逆矩阵的知识编写几种求逆矩阵的算法。为了使内容更完整充实,文中列举了几种基本的求逆矩阵的方法以及整理了一些特殊矩阵求逆的一些简便方法等。最后简要说明了一般矩阵的广义逆矩阵。由于考虑自身学识的不足,我们并未对广义逆矩阵做详细的展开。希望有兴趣的读者能自己探索。
第1页/共30页
寻找更多 ""}

我要回帖

更多关于 矩阵求逆 数值算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信