|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
<P><BR>void JacobiEigen(matrix *matA, matrix *matB, double *m_adEigen)<BR>{<BR> // CMatrix matBBak,matR,matRT,matV;<BR> matrix matBBak,matR,matRT,matV;<BR> double dAlfa,dBeta,dBuf,dBuf1;<BR> double dA,dB,dC;<BR> double dError;<BR> int nRow;<BR> int iRow,iCol;<BR> int loop,loop1;<BR> // CArray<double,double&> adBuf; // double向量<BR> // CUIntArray aiBuf; // unsigned int vector<BR> double *adBuf;<BR> unsigned int *aiBuf;</P>
<P> nRow=matA->m;<BR> MatrixInit(&matBBak,nRow,nRow);<BR> MatrixInit(&matR,nRow,nRow);<BR> MatrixInit(&matRT,nRow,nRow);<BR> MatrixInit(&matV,nRow,nRow);<BR> MatrixCopy(&matBBak,matB);</P>
<P> /* nRow=matA.GetRow();<BR> matBBak.Realloc(nRow,nRow);<BR> matR.Realloc(nRow,nRow);<BR> matRT.Realloc(nRow,nRow);<BR> matV.Realloc(nRow,nRow);<BR> matBBak=matB; */</P>
<P> // matV=0.0;<BR> MatrixZero(&matV);<BR> for(loop=0;loop<nRow;loop++)<BR> matV.a[loop][loop]=1.0;<BR> //matV(loop,loop)=1.0;</P>
<P> dError=1.0e-12;</P>
<P> dBuf=0.0;<BR> for(loop=0;loop<nRow;loop++){<BR> for(loop1=loop+1;loop1<nRow;loop1++){<BR> // dBuf1=matA(loop,loop1)*matA(loop,loop1)/(matA(loop,loop)*matA(loop1,loop1));<BR> dBuf1=p2(matA->a[loop][loop1]) / (matA->a[loop][loop]*matA->a[loop1][loop1]);<BR> if(dBuf<fabs(dBuf1)){<BR> dBuf=fabs(dBuf1);<BR> iRow=loop;iCol=loop1;<BR> }<BR> // dBuf1=matB(loop,loop1)*matB(loop,loop1)/(matB(loop,loop)*matB(loop1,loop1));<BR> dBuf1=p2(matB->a[loop][loop1]) / (matB->a[loop][loop]*matB->a[loop1][loop1]);<BR> if(dBuf<fabs(dBuf1)){<BR> dBuf=fabs(dBuf1);<BR> iRow=loop;iCol=loop1;<BR> }<BR> }<BR> }</P>
<P> printf("nRow=%d dBuf=%f\n",nRow,dBuf);</P>
<P> while(dBuf>dError){<BR> // matR=0.0;<BR> MatrixZero(&matR);<BR> for(loop=0;loop<nRow;loop++) matR.a[loop][loop]=1.0; //matR(loop,loop)=1.0;<BR> // dA=matA(iRow,iRow)*matB(iRow,iCol)-matB(iRow,iRow)*matA(iRow,iCol);<BR> dA=matA->a[iRow][iRow] * matB->a[iRow][iCol] - matB->a[iRow][iRow] * matA->a[iRow][iCol];<BR> // dC=-matA(iCol,iCol)*matB(iRow,iCol)+matB(iCol,iCol)*matA(iRow,iCol);<BR> dC=-matA->a[iCol][iCol] * matB->a[iRow][iCol] + matB->a[iCol][iCol] * matA->a[iRow][iCol];<BR> if(dA==0.0&&dC==0.0){<BR> dAlfa=0.0;<BR> // dBeta=-matA(iRow,iCol)/matA(iCol,iCol);<BR> dBeta=-matA->a[iRow][iCol]/matA->a[iCol][iCol];<BR> }<BR> else{<BR> // dB=matA(iRow,iRow)*matB(iCol,iCol)-matA(iCol,iCol)*matB(iRow,iRow);<BR> dB=matA->a[iRow][iRow]*matB->a[iCol][iCol] - matA->a[iCol][iCol]*matB->a[iRow][iRow];<BR> if(dB>=0.0){<BR> dBuf=dB/2.0;<BR> dAlfa=-dC/(dBuf+sqrt(dBuf*dBuf-dA*dC));<BR> }<BR> else{<BR> dBuf=dB/2.0;<BR> dAlfa=-dC/(dBuf-sqrt(dBuf*dBuf-dA*dC));<BR> }<BR> dBeta=dA/dC*dAlfa;<BR> }<BR> /* matR(iRow,iCol)=dAlfa;<BR> matR(iCol,iRow)=dBeta;<BR> matRT.Trans(matR);</P>
<P> matA=matRT*matA*matR;<BR> matB=matRT*matB*matR;<BR> matV*=matR;<BR> */<BR> matR.a[iRow][iCol]=dAlfa;<BR> matR.a[iCol][iRow]=dBeta;<BR> Transpose(&matR,&matRT);<BR> // 经过修改后的矩阵相乘功能简单而强大,省去了运算符重载。<BR> MatrixMultiply(&matRT,matA,matA); MatrixMultiply(matA,&matR,matA);<BR> MatrixMultiply(&matRT,matB,matB); MatrixMultiply(matB,&matR,matB);<BR> MatrixMultiply(&matV,&matR,&matV);</P>
<P> printf("A:\n");MatrixPrint(matA); printf("B:\n");MatrixPrint(matB);</P>
<P> dBuf=0.0;<BR> for(loop=0;loop<nRow;loop++){<BR> for(loop1=loop+1;loop1<nRow;loop1++){<BR> // dBuf1=matA(loop,loop1)*matA(loop,loop1)/(matA(loop,loop)*matA(loop1,loop1));<BR> dBuf1=p2(matA->a[loop][loop1])/ (matA->a[loop][loop]*matA->a[loop1][loop1]);<BR> if(dBuf<fabs(dBuf1)){<BR> dBuf=fabs(dBuf1);<BR> iRow=loop;iCol=loop1;<BR> }<BR> // dBuf1=matB(loop,loop1)*matB(loop,loop1)/(matB(loop,loop)*matB(loop1,loop1));<BR> dBuf1=p2(matB->a[loop][loop1]) / (matB->a[loop][loop]*matB->a[loop1][loop1]);<BR> if(dBuf<fabs(dBuf1)){<BR> dBuf=fabs(dBuf1);<BR> iRow=loop;iCol=loop1;<BR> }<BR> }<BR> }<BR> getch();<BR> }</P>
<P> /* matRT.Trans(matV);<BR> matR=matRT*matBBak; */<BR> MatrixTranspose(&matV);<BR> MatrixMultiply(&matRT,&matBBak,&matR);<BR> for(loop=0;loop<nRow;loop++){<BR> dBuf=0.0;<BR> for(loop1=0;loop1<nRow;loop1++){<BR> // dBuf+=matR(loop,loop1)*matV(loop1,loop);<BR> dBuf += matR.a[loop][loop1]*matV.a[loop1][loop];<BR> }<BR> if(dBuf<0.0) dBuf=-dBuf;<BR> dBuf=sqrt(dBuf);<BR> for(loop1=0;loop1<nRow;loop1++)<BR> matV.a[loop1][loop] /=dBuf;<BR> // matV(loop1,loop)/=dBuf;<BR> }</P>
<P> // adBuf.SetSize(nRow);<BR> adBuf=(double*)malloc(sizeof(double)*nRow);<BR> for(loop=0;loop<nRow;loop++){<BR> // adBuf[loop]=matA(loop,loop)/matB(loop,loop);<BR> adBuf[loop]=matA->a[loop][loop]/matB->a[loop][loop];<BR> }<BR> // aiBuf.SetSize(nRow);<BR> aiBuf=(unsigned int *)malloc(sizeof(unsigned int)*nRow);<BR> aiBuf[0]=0;<BR> for(loop=0;loop<nRow;loop++){<BR> for(loop1=0;loop1<loop;loop1++){<BR> if(fabs(adBuf[aiBuf[loop1]])>fabs(adBuf[loop])){<BR> // aiBuf.InsertAt(loop1,loop);<BR> for(iRow=nRow-1; iRow>loop1; iRow--)<BR> aiBuf[iRow]=aiBuf[iRow-1];<BR> aiBuf[loop1]=loop;<BR> break;<BR> }<BR> }<BR> if(loop1==loop){<BR> aiBuf[loop1]=loop;<BR> }<BR> }</P>
<P> for(loop=0;loop<nRow;loop++){<BR> m_adEigen[loop]=adBuf[aiBuf[loop]];<BR> }<BR> for(loop=0;loop<nRow;loop++){<BR> for(loop1=0;loop1<nRow;loop1++){<BR> // matB(loop1,loop)=matV(loop1,aiBuf[loop]);<BR> matB->a[loop1][loop]=matV.a[loop1][aiBuf[loop]];<BR> }<BR> }</P>
<P> // matrix and vector free<BR> MatrixFree(&matBBak);<BR> MatrixFree(&matR);<BR> MatrixFree(&matRT);<BR> MatrixFree(&matV);<BR> free(adBuf);<BR> free(aiBuf);<BR>}<BR></P> |
|