各位高手,本人编了一个求矩阵行列式和逆阵的程序。在求逆阵的过程中调用行列式函数,因为矩阵的阶数是变化的,所以我想把矩阵的元素放入一个二维数组内,然后把其首元素地址值传递给行列式函数中的指针参数(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);

}



}

解决方案 »

  1.   

    矩阵函数应为hanglieshi(float *array,int n),我写错了,请问具体怎么用啊?
      

  2.   

    显式转换一下
    比如float x[20][20];
    hanglieshi((float *)x, 20);在行列式函数中
    hanglieshi(float *array, int n)
    {
      x[a][b] <==> array[a*n+b]
    }
      

  3.   

    一种方法是参数定义为数组,固定维数;
    一种方法是参数定义为指针,可变维数:
    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);
    }