首页 > 技术文章 > 高斯消元法矩阵求逆代码

hrlnw 2014-04-10 17:00 原文

自己随便写着玩的,时间复杂度O(n^3),小矩阵使用没什么问题,大矩阵……还是用openCV或者其他的一些线性代数库吧

高斯消元法具体内容自己google吧

头文件

#ifndef inverse_matrix_h_
#define inverse_matrix_h_
#include<string.h>
void inverseMatrix(double** input,double**output,int dimension);
void swap(double** input,double**output,int dimension,int first_row,int second_row);
void reorderOutput(double** output,int dimension);
#endif  //inverse_matrix_h_

cpp文件

#include"inverse_matrix.h"
//高斯消元法求矩阵逆
void inverseMatrix(double** input,double**output,int dimension)
{
    int i,j,k;
    //将输出矩阵初始化为单位矩阵
    for(i=0;i<dimension;i++)
    {
        memset(output[i],0,sizeof(double)*dimension);
        output[i][i]=1;
    }
    for(i=0;i<dimension;++i)  //依次处理每一列
    {
        for(j=0;i<dimension;++j)  //如果当前行当前列值为0,做行变换
        {
            if(input[j][i]!=0)
            {
                swap(input,output,dimension,0,j);
                break;
            }
        }
        for(j=0;j<dimension;++j)  //依次处理每一行
        {
            if(j==0)  //如果是第一行,将input[j][i]设置为1,其他元素均除以input[i][i]
            {
                for(k=dimension-1;k>=0;--k)
                    output[j][k]/=input[j][i];
                for(k=dimension-1;k>=i;--k)
                    input[j][k]/=input[j][i];
            }
            else  //如果不是第一行,将每一行的input[j][i]设置为0,该行其他元素都要倍数的减去第一行对应位置上的值
            {
                for(k=dimension-1;k>=0;--k)
                    output[j][k]=output[j][k]-input[j][i]/input[0][i]*output[0][k];
                for(k=dimension-1;k>=i;--k)
                    input[j][k]=input[j][k]-input[j][i]/input[0][i]*input[0][k];
            }
        }
        swap(input,output,dimension,0,(i+1)%dimension);  //每次都将下一次需要处理的行和当前的第一行交换
    }
    reorderOutput(output,dimension); //因为之前的交换操作,行顺序乱了,需要重新排列一下,即把第一行的数据放到最后一行后面
}

void swap(double** input,double**output,int dimension,int first_row,int second_row)
{
    double* temp_row1=new double[dimension];
    double* temp_row2=new double[dimension];
    int i;
    for(i=0;i<dimension;i++)
    {
        temp_row1[i]=input[first_row][i];
        temp_row2[i]=output[first_row][i];
    }
    for(i=0;i<dimension;i++)
    {
        input[first_row][i]=input[second_row][i];
        output[first_row][i]=output[second_row][i];
        input[second_row][i]=temp_row1[i];
        output[second_row][i]=temp_row2[i];
    }

    delete[] temp_row1;
    delete[] temp_row2;
}

void reorderOutput(double** output,int dimension)
{
    double**temp=new double*[4];
    for(int i=0;i<4;++i)
        temp[i]=new double[4];

    for(int i=1;i<dimension;++i)
        memcpy(temp[i-1],output[i],sizeof(double)*dimension);
    memcpy(temp[dimension-1],output[0],sizeof(double)*dimension);

    for(int i=0;i<dimension;++i)
        memcpy(output[i],temp[i],sizeof(double)*dimension);

    for(int i=0;i<4;++i)
        delete[] temp[i];
    delete[] temp;
}

测试用的main函数

/*
高斯消元法矩阵求逆
*/
#include"inverse_matrix.h"
#include<stdio.h>
#include<windows.h>
#include <bitset>
#include<string>
#include<iostream>
using namespace std;

int main()
{
    int dimension=4;
    double matrix[4][4]={{1,1,1,1},{2,3,1,1},{3,-1,2,-1},{4,1,-3,2}};
    //double matrix[3][3]={{0,1,2},{1,1,4},{2,-1,0}};
    double**input=new double*[dimension];
    for(int i=0;i<dimension;++i)
    {
        input[i]=new double[dimension];
        for(int j=0;j<dimension;++j)
            input[i][j]=matrix[i][j];
    }
    double**output=new double*[dimension];
    for(int i=0;i<dimension;++i)
        output[i]=new double[dimension];

    inverseMatrix(input,output,dimension);

    for(int i=0;i<dimension;++i)
    {
        delete[] input[i];
        delete[] output[i];
    }
    delete[] input;
    delete[] output;
    system("pause");
    return 0;
}

 

 

推荐阅读