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

求复矩阵乘法以及复矩阵求逆

发布于 2010-05-05 14:59, 899 次点击
帮俺检查一下啊  谢谢!!!
复矩阵求逆
#define  M 60

juzhenqiuni(float *g,float*b,int n1)/*要求逆的矩阵为(g+jb)是n1*n1阶矩阵,得到的逆矩阵仍然由(g+jb)带回*/
{
    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};
    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];b1[i][j+n1]=E[i][j];
        }
        do{
            k=1;
            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);
    for(i=1;i<=n1;i++)
        for(j=1;j<=n1;j++)
        {
            g[i][j]=g1[i][j];
            b[i][j]=b1[i][j];
        }
}


矩阵乘法

juzhenchengfa(float *A1,float *A2,float *B1,float *B2,float *C1,float *C2,int a,int b)
/*为矩阵(A1*jA1)(a*b阶)与矩阵(B1*jB1)(b*a阶)的乘法结果为(C1*jC1)(a*a阶)*/
{
    static float d=0.0,t=0.0;
    for(i=1;i<=a;i++)
    {
        for(j=1;j<=b;j++)
            for(k=1;k<=a;k++)
            {
                d=d+A1[i][k]*B1[k][j]-A2[i][k]*B2[k][j];
                t=t+A1[i][k]*B2[k][j]-A2[i][k]*B1[k][j];
            }
            C1[i][j]=d;
            C2[i][j]=t;
    }
}

2 回复
#2
2010-05-05 15:06
我在调试中总是报错 error C2109: subscript requires array or pointer type
#3
2010-05-06 09:44
偶自己修改了一下  但是运行不出结果
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#define  M 3


/*********************************************************************************************
函数名: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];b1[i][j+n1]=E[i][j];
        }
/********************************************************************************************
以下为求逆的过程
*********************************************************************************************/        
        do{
            k=1;
            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);
    for(i=1;i<=n1;i++)
        for(j=1;j<=n1;j++)
        {
            g[i][j]=g1[i][j];
            b[i][j]=b1[i][j];
        }
}
            

void main()
{
    float g[3][3]={1,2,3,2,2,1,3,4,3};
    float b[3][3]={0};
    int n1,j,i;
    FILE *fp1;
   
   
    n1=3;
    juzhenqiuni(g,b,n1);
    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]);
    }
    fclose(fp1);

}
1