注册 登录
编程论坛 C++教室

偶自己编程了一个复矩阵求逆的小程序 觉得蛮得意的 放上来晒一下啦

发布于 2010-05-06 12:19, 468 次点击
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#define  M 4


/*********************************************************************************************
函数名:juzhenqiuni
功能:求矩阵(g+jb)(n1*n1阶)的逆矩阵
参数:由g[M][M],b[M][M], n1传递
返回值:由(g+jb)(n1*n1阶)带回
**********************************************************************************************/
void juzhenqiuni(float g[M][M],float b[M][M],int n1)
{
    static float Re,Im,t,d;
    static float E[M][M]={0.0},g1[M][2*M]={0.0},b1[M][2*M]={0.0};
    int i,j,k;
/*********************************************************************************************
以下为形成增广矩阵的过程
**********************************************************************************************/
    for(i=1;i<=n1;i++) E[i][i]=1;
    for(i=1;i<=n1;i++)
        for(j=1;j<=n1;j++)
        {
            g1[i][j]=g[i][j];g1[i][j+n1]=E[i][j];
            b1[i][j]=b[i][j];
        }
/********************************************************************************************
以下为求逆的过程
*********************************************************************************************/        
        k=1;
        do{
            
            Re=g1[k][k]/(g1[k][k]*g1[k][k]+b1[k][k]*b1[k][k]);
            Im=-b1[k][k]/(g1[k][k]*g1[k][k]+b1[k][k]*b1[k][k]);
            for(j=k+1;j<=2*n1;j++)
            {t=g1[k][j];d=b1[k][j];
             g1[k][j]=t*Re-d*Im;
             b1[k][j]=d*Re+t*Im;
            }
            for(i=k+1;i<=n1;i++)
                for(j=k+1;j<=2*n1;j++)
                {
                    g1[i][j]=g1[i][j]-g1[i][k]*g1[k][j]+b1[i][k]*b1[k][j];
                    b1[i][j]=b1[i][j]-g1[i][k]*b1[k][j]-b1[i][k]*g1[k][j];
                }
            k++;
        }while(k<=n1);
        if(k!=1)
        {
            for(i=n1-1;i>=1;i--)
                for(k=n1;k>i;k--)
                    for(j=n1+1;j<=2*n1;j++)
                        g1[i][j]=g1[i][j]-g1[i][k]*g1[k][j]+b1[i][k]*b1[k][j];
                        b1[i][j]=b1[i][j]-g1[i][k]*b1[k][j]-b1[i][k]*g1[k][j];
        }
    for(i=1;i<=n1;i++)
        for(j=1;j<=n1;j++)
        {
            g[i][j]=g1[i][j+n1];
            b[i][j]=b1[i][j+n1];
        }
}
            

void main()
{
    float g[4][4]={0,0,0,0,0,1,2,3,0,2,2,1,0,3,4,3};
    float b[4][4]={0};
    int n1,j,i;
    FILE *fp1;
   
   
    n1=3;
   
    fp1=fopen("output.txt","w");
    for(i=1;i<=3;i++)
    {
        fprintf(fp1,"\n");
        for(j=1;j<=3;j++)
            fprintf(fp1,"%8.4f+j%8.4f     ",g[i][j],b[i][j]);
    }

    fprintf(fp1,"\n");

juzhenqiuni(g,b,n1);
    for(i=1;i<=3;i++)
    {
        fprintf(fp1,"\n");
        for(j=1;j<=3;j++)
            fprintf(fp1,"%8.4f+j%8.4f     ",g[i][j],b[i][j]);
    }
    fclose(fp1);

}
1 回复
#2
ltyjyufo2010-05-06 15:38
  加油呵呵。。。
1