矩阵求逆

   这几天在学习数组图像的相关知识,这才发现线性代数的重要性啊,线性代数虽然难不难,但是有的知识过了就忘了,这不要用到矩阵的逆矩阵进行运算了,赶紧拿书恶补一通,不用我多说,矩阵的逆拿来干嘛,怎么定义啥的,都自己百度解决,这里给出我的代码,方便以后直接运用:


#include <iostream>
#include <cstdio>

#define MAX 20  
#define E 0.000000001 

using namespace std;

/** 
 * 计算矩阵src的模 
 */ 
double calculate_A( double src[][MAX], int n ){  
    int i,j,k,x,y;  
    double tmp[MAX][MAX], t;  
    double result = 0.0;  
       
    if( n == 1 ){  
        return src[0][0];  
    }  
       
    for( i = 0; i < n; ++i )  {  
        for( j = 0; j < n - 1; ++j )  {  
            for( k = 0; k < n - 1; ++k ) {  
                x = j + 1;  
                y = k >= i ? k + 1 : k;  
                   
                tmp[j][k] = src[x][y];  
            }  
        }  
           
        t = calculate_A( tmp, n - 1 );  
           
        if( i % 2 == 0 )  {  
            result += src[0][i] * t;  
        }  
        else {  
            result -= src[0][i] * t;  
        }  
    }  
   
    return result;  
}  
   
/** 
 * 计算伴随矩阵 
 */ 
void calculate_A_adjoint( double src[MAX][MAX], double dst[MAX][MAX], int n )  {  
    int i, j, k, t, x, y;  
    double tmp[MAX][MAX];  
   
    if( n == 1 )  {  
        dst[0][0] = 1;  
        return;  
    }  
       
    for( i = 0; i < n; ++i )  {  
        for( j = 0; j < n; ++j )  {  
            for( k = 0; k < n - 1; ++k )  {  
                for( t = 0; t < n - 1; ++t )  {  
                    x = k >= i ? k + 1 : k ;  
                    y = t >= j ? t + 1 : t;  
                       
                    tmp[k][t] = src[x][y];  
                }  
            }  
               
            dst[j][i]  =  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];  
    int i, j;  
   
    if ( fabs( A - 0 ) <= E )  {  
        printf("不可能有逆矩阵!\n");  
        return 0;  
    }  
   
    calculate_A_adjoint( src, tmp, n );    
   
    for( i = 0; i < n; ++i )    {    
        for( j = 0; j < n; ++j )    {    
            dst[i][j] = (double)( tmp[i][j] / A );  
        }    
    }  
   
    return 1;  
}  
   
/** 
 * 输出矩形查看 
 */ 
void print_M( double M[][MAX], int n )  {  
    int i, j;  
       
    for ( i = 0; i < n; ++i )  {  
        for ( j = 0; j < n; ++j )  {  
            printf("%lf ", M[i][j]);  
        }  
           
        printf("\n");  
    }  
}  
   
/** 
 * main 
 */ 
int main(){  
    /** 
     * 测试矩阵 
     */ 
    double test[MAX][MAX], dst[MAX][MAX];  
    int n = 3;  
    int is_exist;  
       
    /** 
     * 构造最简单的: 
     *  1, 0, 0, 
     *  0, 2, 0, 
     *  0, 0, 5 
     */ 
    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);  
    }  
    else {  
        printf("不存在!\n");  
    }  
    getchar();
    return 0;  
}  



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值