各位高手,本人编了一个求矩阵行列式和逆阵的程序。在求逆阵的过程中调用行列式函数,因为矩阵的阶数是变化的,所以我想把矩阵的元素放入一个二维数组内,然后把其首元素地址值传递给行列式函数中的指针参数(float *array,int n)其中int n 表示行列式的阶数。但是我编译了一下,怎么也过不去,请问怎么处理呢?我的函数如下://求协方差矩阵
float CFisterDlg::covarray(float y[][16], int frames)
{
float s=0,n=0;
float sum[16],E[16];
float cov[16][16];
float w;
int i,j,k;
for(i=0;i<16;i++)
for(j=0;j<frames;j++)
sum[i]+=y[j][i];
for(i=1;i<=16;i++)
E[i]=sum[i-1]/frames;
for(i=1;i<=16;i++)
for( j=1;j<=16;j++)
{
if(i==j)
{
for( k=0;k<frames;k++)
s+=(y[k][i]-E[i])*(y[k][i]-E[i]);
cov[j][i]=s/frames;
}
else
{
for(k=0;k<frames;k++)
{
s+=(y[k][i]-E[i]);
n+=(y[k][j]-E[j]);
}
s=s/frames;
n=n/frames;
cov[j][i]=s*n;
}
}
w=hanglieshi(cov,16);
return w;
}//求矩阵行列式的值
float CFisterDlg::hanglieshi(float array[][], int n)
{
int m1=0,m2=0,i,j,k;
float R=1.0,s;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(m1==0)
if(i>j)
if(array[i][j]<0||array[i][j]>0) m1+=1;
if(m2==0)
if(i<j)
if(array[i][j]>0||array[i][j]<0) m2+=1;
}
}
if(m1==0||m2==0)
for(i=1;i<n;i++) R*=array[i][i];
else for(i=1;i<=n;i++)
if(array[i][i]==0)
{
for(k=i+1;k<n;k++)
if(array[k][i]<0||array[k][i]>0)
{
for(j=1;j<=n;j++)
{
s=array[i][j];
array[i][j]=array[k][j];
array[k][j]=s;
R=-R;
}
break;
}
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
if(j==i&&array[i][j]==0)
{
R=0.0;
break;
}
else if(j==i&&(array[i][j]>0||array[i][j]<0))
{
R*=array[i][j];
for(k=i+1;k<=n;k++)
if(array[k][j]>0||array[k][j]<0)
{
array[k][j]=0;
for(int m=j+1;m<=n;m++)
{
s=array[i][j]/array[k][j];
array[k][m]*=s;
}
}
}
}
return R;
}//求协方差矩阵的逆矩阵void CFisterDlg::reversecovarray(float *covarray, int v)
{
float *A;
//CArray<float,float> A;
int i,j,k,n,m;
float s;
for(i=1;i<v+1;i++)
for(j=1;j<v+1;j++)
{
for(k=1;k<i;k++)
for(m=1;m<j;m++)
A[k][m]=covarray[k][m];
for(k=1;k<i;k++)
for(m=j+1;m<v+1;m++)
A[k][m-1]=covarray[k][m];
for(k=i+1;k<=v+1;k++)
for(m=1;m<j;m++)
A[k-1][m]=covarray[k][m];
for(k=i+1;k<=v+1;k++)
for(m=j+1;m<=v+1;m++)
A[k-1][m-1]=covarray[k][m];
if((i+j)%2==0)
reversecovarray[j][i]=hanglieshi(A,v);
else
reversecovarray[j][i]=-hanglieshi(A,v);
}
}
float CFisterDlg::covarray(float y[][16], int frames)
{
float s=0,n=0;
float sum[16],E[16];
float cov[16][16];
float w;
int i,j,k;
for(i=0;i<16;i++)
for(j=0;j<frames;j++)
sum[i]+=y[j][i];
for(i=1;i<=16;i++)
E[i]=sum[i-1]/frames;
for(i=1;i<=16;i++)
for( j=1;j<=16;j++)
{
if(i==j)
{
for( k=0;k<frames;k++)
s+=(y[k][i]-E[i])*(y[k][i]-E[i]);
cov[j][i]=s/frames;
}
else
{
for(k=0;k<frames;k++)
{
s+=(y[k][i]-E[i]);
n+=(y[k][j]-E[j]);
}
s=s/frames;
n=n/frames;
cov[j][i]=s*n;
}
}
w=hanglieshi(cov,16);
return w;
}//求矩阵行列式的值
float CFisterDlg::hanglieshi(float array[][], int n)
{
int m1=0,m2=0,i,j,k;
float R=1.0,s;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(m1==0)
if(i>j)
if(array[i][j]<0||array[i][j]>0) m1+=1;
if(m2==0)
if(i<j)
if(array[i][j]>0||array[i][j]<0) m2+=1;
}
}
if(m1==0||m2==0)
for(i=1;i<n;i++) R*=array[i][i];
else for(i=1;i<=n;i++)
if(array[i][i]==0)
{
for(k=i+1;k<n;k++)
if(array[k][i]<0||array[k][i]>0)
{
for(j=1;j<=n;j++)
{
s=array[i][j];
array[i][j]=array[k][j];
array[k][j]=s;
R=-R;
}
break;
}
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
if(j==i&&array[i][j]==0)
{
R=0.0;
break;
}
else if(j==i&&(array[i][j]>0||array[i][j]<0))
{
R*=array[i][j];
for(k=i+1;k<=n;k++)
if(array[k][j]>0||array[k][j]<0)
{
array[k][j]=0;
for(int m=j+1;m<=n;m++)
{
s=array[i][j]/array[k][j];
array[k][m]*=s;
}
}
}
}
return R;
}//求协方差矩阵的逆矩阵void CFisterDlg::reversecovarray(float *covarray, int v)
{
float *A;
//CArray<float,float> A;
int i,j,k,n,m;
float s;
for(i=1;i<v+1;i++)
for(j=1;j<v+1;j++)
{
for(k=1;k<i;k++)
for(m=1;m<j;m++)
A[k][m]=covarray[k][m];
for(k=1;k<i;k++)
for(m=j+1;m<v+1;m++)
A[k][m-1]=covarray[k][m];
for(k=i+1;k<=v+1;k++)
for(m=1;m<j;m++)
A[k-1][m]=covarray[k][m];
for(k=i+1;k<=v+1;k++)
for(m=j+1;m<=v+1;m++)
A[k-1][m-1]=covarray[k][m];
if((i+j)%2==0)
reversecovarray[j][i]=hanglieshi(A,v);
else
reversecovarray[j][i]=-hanglieshi(A,v);
}
}
比如float x[20][20];
hanglieshi((float *)x, 20);在行列式函数中
hanglieshi(float *array, int n)
{
x[a][b] <==> array[a*n+b]
}
一种方法是参数定义为指针,可变维数:
void test1(float array[9][9],int x,int y)
{
for(int i=0;i<x;i++)
for(int j=0;j<y;j++)
{
CString text;
text.Format("%f",array[i][j]);
AfxGetApp()->m_pMainWnd->SetWindowText(text);
Sleep(200);
}
}
void test2(float * array,int x,int y)
{
for(int i=0;i<x;i++)
for(int j=0;j<y;j++)
{
CString text;
text.Format("%f",*(array+i*y+j));
AfxGetApp()->m_pMainWnd->SetWindowText(text);
Sleep(200);
}
}
void maintest()
{
int i,j;
int m=4,n=5;
float a[9][9];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
a[i][j]=rand()*1.0;
test1(a,m,n);
//
float aa[4][5];
for(i=0;i<4;i++)
for(j=0;j<5;j++)
aa[i][j]=rand()*1.0;
test2(&aa[0][0],4,5);
}