⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interfunc.cpp

📁 要求出一个矩阵的逆矩阵有许多方法
💻 CPP
字号:

#include "stdafx.h"
#include <malloc.h>
#include <math.h>
#include "interfunc.h"
/**********************************************************************************/
//内部函数
//
//
/**********************************************************************************/
//  求协方差矩阵M(1)的逆
 void M1_1(float **m,int L,float **returnM)
{
   //根据X(1)向量的长度L,可以确定M(1),求得R(1)
  int i,j,k,n;
   long *r,*c;
   float *temp,Pivot;
   bool NoCompare;
   
   int  row;
   row=L;
   r=(long *)calloc(row,sizeof(long));
   c=(long *)calloc(row,sizeof(long));
   temp=(float *)calloc(row,sizeof(float));

   for(i=0;i<row;i++)
   {
	   c[i]=0;
	   r[i]=0;	   
	   for(j=0;j<row;j++)
	   {
		  returnM[i][j]=0; 
	   }
   }  
   for(i=0;i<row;i++)
	   returnM[i][i]=1;
   for(i=0;i<row;i++)
   {
       Pivot=0;
	   NoCompare=false;
	   for(j=0;j<row;j++)
	   {
          for(n=0;n<i;n++)
		  {
              NoCompare=(j==c[n]);
			  if(NoCompare)
				  break;
		  }
		  if(NoCompare==false)
		  {
              for(k=0;k<row;k++)
			  {
				  for(n=1;n<i;n++)
				  {
					  NoCompare=(k==r[n]);
					  if(NoCompare)
						  break;
				  }
				  if(NoCompare==false)
				  {
                     if(fabs(m[k][j])>=fabs(Pivot))
					 {
						 Pivot=fabs(m[k][j]);
						 r[i]=k;
						 c[i]=j;
					 }
				  }
			  }
		  }
	   }
       Pivot=m[r[i]][c[i]];
	   if((Pivot!=1)&&(Pivot!=0))
	   {
		   for(k=0;k<row;k++)
		   {
			   m[r[i]][k]=m[r[i]][k]/Pivot;
               returnM[r[i]][k]=returnM[r[i]][k]/Pivot;
		   }
		   for(j=0;j<row;j++)
		   {
			   Pivot=m[j][c[i]];
			   if((j!=r[i])&&(Pivot!=0))
			   {
				   for(k=0;k<row;k++)
				   {
					   m[j][k]=m[j][k]-m[r[i]][k]*Pivot;
					   returnM[j][k]=returnM[j][k]-returnM[r[i]][k]*Pivot;
				   }
			   }
		   }
	   }
   }
   for(i=0;i<row-1;i++)
   {
	   if(r[i]!=c[i])
	   {
		   for(j=0;j<row;j++)
		   {
			   temp[j]=returnM[r[i]][j];
			   returnM[r[i]][j]=returnM[c[i]][j];
			   returnM[c[i]][j]=temp[j];
		   }
	   }
	   for(j=i+1;j<row;j++)
	   {
          if(r[j]==c[i])
          {   
			  r[j]=r[i];
			  break;
		  }
		  r[i]=c[i];
	   }
   }
   free(r);
   free(c);
   free(temp);
}


/**********************************************************************************/
//填写向量X(i)的每个分量值(空间)                      第i行 第j列         X向量  X的尺寸(一维)
void GetX_i(int **inImage,int iHei,int iWid,int i,int j,float *XVector,int L_X)
{
	int ii,jj;
	int m,n,p,temp_i,temp_j;
	
	m=(int)(sqrt(L_X));//搜索框的边长
	n=(m-1)/2;//搜索框的半边长
    if((i>=n)&&(i<iHei-n)&&(j>=n)&&(j<iWid-n))
	{
		i=i-n;
		j=j-n;
		p=0;
		for(ii=0;ii<m;ii++)
		{
			for(jj=0;jj<m;jj++)
			{
				XVector[p++]=inImage[i+ii][j+jj]; 
			}
		}
    }
	else
	{
		i=i-n;
		j=j-n;
		p=0;
		for(ii=0;ii<m;ii++)
		{
			temp_i=i+ii;
			if(i+ii<0)
				temp_i=-1-i-ii;
			else
				if(i+ii>=iHei)
					temp_i=iHei-(i+ii-iHei+1);
			for(jj=0;jj<m;jj++)
			{
				temp_j=j+jj;
                if(j+jj<0)
					temp_j=-1-j-jj;
				else
					if(j+jj>iWid)
						temp_j=iWid-(j+jj-iWid+1);
				XVector[p++]=inImage[temp_i][temp_j]; 
			}
		}
	}
}

/**********************************************************************************/
//填写向量X(i)的每个分量值(时间)     第i行 第j列          X向量  X的尺寸(一维)
void GetX_i_T(unsigned char   ***inImage,int i,int j,float *XVector,int L_X)
{
    int n;
	for(n=0;n<L_X;n++)
	{
		XVector[n]=inImage[n][i][j];
	}
}

void GetX_i_T2(float  ***inImage,int i,int j,float *XVector,int L_X)
{
    int n;
	for(n=0;n<L_X;n++)
	{
		XVector[n]=inImage[n][i][j];
	}
}
/**********************************************************************************/
//迭代
void Iterative9(float *X_1,int L_X,float **R_k,float **R_k1)
{
	int i,j;
	float temp;
	float temp1[9],temp2[9],temp3[9][9];

    for(i=0;i<L_X;i++)
	{
		temp1[i]=0;
		for(j=0;j<L_X;j++)
		{
            temp1[i]+=R_k[i][j]*X_1[j];
		}
	}
    for(i=0;i<L_X;i++)
	{
		temp2[i]=0;
		for(j=0;j<L_X;j++)
		{
            temp2[i]+=X_1[j]*R_k[j][i];
		}
	}
	for(i=0;i<L_X;i++)
	{
		for(j=0;j<L_X;j++)
		{
            temp3[i][j]=temp1[i]*temp2[j];
		}
	}

 	temp=1;
	for(i=0;i<L_X;i++)
	{
        temp+=X_1[i]*temp2[i];
	}

    for(i=0;i<L_X;i++)
	{
		for(j=0;j<L_X;j++)
		{
            R_k1[i][j]=R_k[i][j]-temp3[i][j]/temp;
			R_k[i][j]=R_k1[i][j];//-temp3[i][j]/temp;
		}
	}
}
/**********************************************************************************/
//迭代
void Iterative5(float *X_1,int L_X,float **R_k,float **R_k1)
{
	int i,j;
	float temp;
	float temp1[5],temp2[5],temp3[5][5];

    for(i=0;i<L_X;i++)
	{
		temp1[i]=0;
		for(j=0;j<L_X;j++)
		{
            temp1[i]+=R_k[i][j]*X_1[j];
		}
	}
    for(i=0;i<L_X;i++)
	{
		temp2[i]=0;
		for(j=0;j<L_X;j++)
		{
            temp2[i]+=X_1[j]*R_k[j][i];
		}
	}
	for(i=0;i<L_X;i++)
	{
		for(j=0;j<L_X;j++)
		{
            temp3[i][j]=temp1[i]*temp2[j];
		}
	}

 	temp=1;
	for(i=0;i<L_X;i++)
	{
        temp+=X_1[i]*temp2[i];
	}

    for(i=0;i<L_X;i++)
	{
		for(j=0;j<L_X;j++)
		{
            R_k1[i][j]=R_k[i][j]-temp3[i][j]/temp;
            R_k[i][j]=R_k1[i][j];
		}
	}
}
/**********************************************************************************/
//迭代
void Iterative7(float *X_1,int L_X,float **R_k,float **R_k1)
{
	int i,j;
	float temp;
	float temp1[7],temp2[7],temp3[7][7];

    for(i=0;i<L_X;i++)
	{
		temp1[i]=0;
		for(j=0;j<L_X;j++)
		{
            temp1[i]+=R_k[i][j]*X_1[j];
		}
	}
    for(i=0;i<L_X;i++)
	{
		temp2[i]=0;
		for(j=0;j<L_X;j++)
		{
            temp2[i]+=X_1[j]*R_k[j][i];
		}
	}
	for(i=0;i<L_X;i++)
	{
		for(j=0;j<L_X;j++)
		{
            temp3[i][j]=temp1[i]*temp2[j];
		}
	}

 	temp=1;
	for(i=0;i<L_X;i++)
	{
        temp+=X_1[i]*temp2[i];
	}

    for(i=0;i<L_X;i++)
	{
		for(j=0;j<L_X;j++)
		{
            R_k1[i][j]=R_k[i][j]-temp3[i][j]/temp;
		}
	}
}
/**********************************************************************************/
//交换  remit R_K1->R_k
void remit(float **R_k1,float **R_k,int L_X)
{
    int i,j;
    for(i=0;i<L_X;i++)
	{
		for(j=0;j<L_X;j++)
		{
            R_k[i][j]=R_k1[i][j];
		}
	}
}


/**********************************************************************************/
void  add_M(float **R_k1,float **R_k,int L_X)
{
    int i,j;
	for(i=0;i<L_X;i++)	
		for(j=0;j<L_X;j++)
            R_k1[i][j]=R_k1[i][j]+R_k[i][j];
	
}
/**********************************************************************************/
void  div_M(float **m,int div,int L_X)
{
    int i,j;
	for(i=0;i<L_X;i++)	
		for(j=0;j<L_X;j++)
            m[i][j]=m[i][j]/div;
	
}
/**********************************************************************************/
void  MMT(float *X_1,float **R_k,int L_X)
{
   int i,j;
   for(i=0;i<L_X;i++)
	   for(j=0;j<=i;j++)
		   R_k[i][j]=X_1[i]*X_1[j];
   for(i=0;i<L_X;i++)
	   for(j=i+1;j<L_X;j++)
		   R_k[i][j]=R_k[j][i];
}
/**********************************************************************************/
//计算行列式
float hls33(float *W)
{
   float value;
   value=W[0]*W[4]*W[8]+W[1]*W[5]*W[6]+W[2]*W[3]*W[7]-W[2]*W[4]*W[6]-W[0]*W[5]*W[7]-W[1]*W[3]*W[8];
   return(value);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -