📄 realmatrix.cpp
字号:
srcR.pData=srcR.pData->pRight;
dbMatrixR[srcR.pData->nRow]=srcR.pData->data;
}
else
dbMatrixR[srcR.pData->nRow]=srcR.pData->data;
srcR.pCurrent=srcR.pCurrent->pNext;
srcR.pData=srcR.pCurrent;
}
//concalute srcHR----H(T)R and form the triangle of H(T)RH
srcHR=*this;
srcHR.pData=srcHR.pHead->pNext;
srcHR.pCurrent=srcHR.pData;
while(srcHR.pCurrent!=srcHR.pTail)
{
while(srcHR.pData->pRight!=NULL)
{
srcHR.pData=srcHR.pData->pRight;
srcHR.pData->data*=dbMatrixR[srcHR.pData->nRow];
}
srcHR.pCurrent=srcHR.pCurrent->pNext;
srcHR.pData=srcHR.pCurrent;
}
srcHR=srcHR.Transpose();
//caluation HRH
srcHR.pCurrent=srcHR.pTail->pPrev;
while(srcHR.pCurrent->nRow==0)
srcHR.pCurrent=srcHR.pCurrent->pPrev;
srcHR.pData=srcHR.pCurrent;
CNode* pTemp;
while(srcHR.pCurrent!=srcHR.pHead)
{
double sum=0;
while(srcHR.pData->pRight!=NULL)
{
srcHR.pData=srcHR.pData->pRight;
if(dbMatrixR[srcHR.pData->nCol]==0) continue;
sum+=srcHR.pData->data*
srcHR.pData->data/dbMatrixR[srcHR.pData->nCol];
}
srcHRH.Store(srcHR.pCurrent->nRow,srcHR.pCurrent->nRow,sum);
pTemp=srcHR.pCurrent->pPrev;
CNode* pTemp1;
while(pTemp!=srcHR.pHead)
{
sum=0;
srcHR.pData=srcHR.pCurrent;
pTemp1=pTemp;
while(srcHR.pData->pRight!=NULL)
{
srcHR.pData=srcHR.pData->pRight;
while(pTemp->pRight!=NULL&&
pTemp->pRight->nCol<srcHR.pData->nCol)
pTemp=pTemp->pRight;
if(pTemp->pRight!=NULL&&pTemp->pRight->nCol==srcHR.pData->nCol)
{
pTemp=pTemp->pRight;
sum+=srcHR.pData->data*pTemp->data/dbMatrixR[srcHR.pData->nCol];
}
else if(pTemp->pRight==NULL)
break;
}
if(sum!=0)
srcHRH.Store(srcHR.pCurrent->nRow,pTemp1->nRow,sum);
pTemp=pTemp1->pPrev;
}
srcHR.pCurrent=srcHR.pCurrent->pPrev;
srcHR.pData=srcHR.pCurrent;
}
delete[] dbMatrixR;
} //#end if
return srcHRH;
}
CRealMatrix CRealMatrix::Inverse1()
{
CRealMatrix matrix_1;
if(pHead->nRow==pHead->nCol&&pHead->nRow!=0)
{
int n=pHead->nRow;
double* array=new double[n*(n+1)/2];
GoToHead();
for(int i=1;i<=n;++i)
{
double value;
GoNext();
GoRight();
GetData(pData->nRow,pData->nCol,value);
for(int j=1;j<=i-1;++j)
{
if(array[j*(j-1)/2+j-1]==0)
return matrix_1;
double sum=0;
for(int k=1;k<=j-1;++k)
sum+=array[i*(i-1)/2+k-1]*array[j*(j-1)/2+k-1];
if(j<pData->nCol)
array[i*(i-1)/2+j-1]=-sum/array[j*(j-1)/2+j-1];
else
{
array[i*(i-1)/2+j-1]=(value-sum)/array[j*(j-1)/2+j-1];
GoRight();
GetData(pData->nRow,pData->nCol,value);
}
}
double sum=0;
for(j=1;j<=i-1;++j)
sum+=array[i*(i-1)/2+j-1]*array[i*(i-1)/2+j-1];
if(value<sum)
return matrix_1;
array[i*(i-1)/2+i-1]=sqrt(value-sum);
}
for(i=1;i<=n;++i)
{
if(array[i*(i-1)/2+i-1]==0)
return matrix_1;
for(int j=1;j<i;++j)
{
double sum=0;
for(int k=j;k<i;++k)
sum+=array[i*(i-1)/2+k-1]*array[k*(k-1)/2+j-1];
array[i*(i-1)/2+j-1]=-sum/array[i*(i-1)/2+i-1];
}
array[i*(i-1)/2+i-1]=1/array[i*(i-1)/2+i-1];
}
matrix_1.Create(n,n);
for(i=1;i<=n;++i)
for(int j=1;j<=i;++j)
if(array[i*(i-1)/2+j-1]!=0)
matrix_1.Store(i,j,array[i*(i-1)/2+j-1]);
delete[] array;
matrix_1=matrix_1.Transpose()*matrix_1;
}
return matrix_1;
}
BOOL CRealMatrix::Decompose2()
{
int n=pHead->nRow;
if(n==pHead->nCol&&n!=0)
{
CNode* psrcCurrent=pHead->pNext;
CNode* psrcData=psrcCurrent;
while(psrcCurrent!=pTail)
{
pData=psrcCurrent;
while(pData->pRight!=NULL&&pData->pRight->nCol<=psrcCurrent->nRow)
pData=pData->pRight;
psrcData=pData;
//计算Dii
double value=GetDia(psrcCurrent->nRow,psrcCurrent->nRow);
if(value==0) return 1;//对角元为0
//计算Uij
for(INT j=psrcCurrent->nRow+1;j<=n;++j)
double valueU=GetUp(psrcCurrent->nRow,j);
CNode* pNode=psrcData;
if(pNode->nCol>psrcCurrent->nRow)
pNode->data/=value;
while(pNode->pRight!=NULL)
{
pNode=pNode->pRight;
pNode->data/=value;
}
psrcCurrent=psrcCurrent->pNext;
psrcData=psrcCurrent;
}
return 2;
}
return 0;
}
double CRealMatrix::GetDia(INT row,INT col)
{
double sum=0;
double valueU;
CNode* pCol=pHead;
CNode* pTemp=pHead;
for(INT k=1;k<=row-1;++k)
{
pTemp=pTemp->pNext;
while(pTemp->nRow<k)
pTemp=pTemp->pNext;
valueU=GetUpEle(row,pTemp);
sum+=valueU*valueU;
}//#end for
if(pData->nCol==row)
{
pData->data=sqrt(pData->data-sum);
return pData->data;
}
double value=sqrt(-sum);
Add(row,row,value);
return value;
}
double CRealMatrix::GetUp(INT row,INT col)
{
double sum=0;
double valueL,valueU;
CNode* pCol=pHead;
CNode* pTemp=pHead;
for(INT k=1;k<=row-1;++k)
{
pTemp=pTemp->pNext;
while(pTemp->nRow<k)
pTemp=pTemp->pNext;
pCol=pTemp;
valueU=GetUpEle(col,pCol);
if(valueU==0) continue;
valueL=GetUpEle(row,pTemp);
if(valueL==0) continue;
sum+=valueL*valueU;
}
CNode* pNode=pHead->pNext;
while(pNode->nRow<row)
pNode=pNode->pNext;
while(pNode->pRight!=NULL&&pNode->pRight->nCol<=col)
pNode=pNode->pRight;
if(pNode->nCol==col)
{
pNode->data-=sum;
if(pNode->data==0)
{
DeleteNode(row,col);
return 0;
}
return pNode->data;
}
Add(row,col,-sum);
return -sum;
}
BOOL CRealMatrix::DecomposeEx1()
{
int n=pHead->nRow;
if(n==pHead->nCol&&n!=0)
{
CNode* psrcCurrent=pHead->pNext;
CNode* psrcData=psrcCurrent;
while(psrcCurrent!=pTail)
{
//计算Lij
for(INT j=1;j<=psrcCurrent->nRow-1;++j)
{
CNode* pNode=psrcCurrent;
CNode* pNew=pHead->pNext;
double valueU=GetDownEle0(psrcData->nRow,j);
if(valueU==0) continue;
while(pNew->nRow<j)
pNew=pNew->pNext;
while(pNew->pRight!=NULL&&pNew->pRight->nCol<=j)
pNew=pNew->pRight;
while(pNode->pRight!=NULL&&pNode->pRight->nCol<=j)
pNode=pNode->pRight;
pNode->data/=pNew->data;
}
pData=psrcCurrent;
while(pData->pRight!=NULL&&pData->pRight->nCol<=psrcCurrent->nRow)
pData=pData->pRight;
//计算Dii
psrcData=pData;
double value=GetDia0(psrcCurrent->nRow,psrcCurrent->nRow);
if(value==0) return 1;//对角元为0
psrcCurrent=psrcCurrent->pNext;
psrcData=psrcCurrent;
}//#end while
return 2;
}
return 0; //该矩阵为空或不为方阵
}
double CRealMatrix::GetDia0(INT row,INT col)
{
double sum=0;
double valueU,valueD;
CNode* pCol=pHead->pNext;
CNode* pTemp=pHead;
while(pCol->nRow<row)
pCol=pCol->pNext;
for(INT k=1;k<=row-1;++k)
{
valueU=GetUpEle(k,pCol);
if(valueU==0) continue;
pTemp=pTemp->pNext;
while(pTemp->nRow<k)
pTemp=pTemp->pNext;
valueD=GetDiaEle(k,pTemp);
sum+=valueU*valueD*valueU;
}//#end for
if(pData->nCol==row)
{
pData->data-=sum;
return pData->data;
}
Add(row,row,-sum);
return -sum;
}
double CRealMatrix::GetDownEle0(INT row,INT col)
{
double sum=0;
double valueD,valueL,valueU;
CNode* pRow=pHead->pNext;
CNode* pCol=pHead->pNext;
CNode* pTemp=pHead;
while(pRow->nRow<row)
pRow=pRow->pNext;
for(INT k=1;k<=col-1;++k)
{
if(pRow->pRight!=NULL&&pRow->pRight->nCol<row)
{
pRow=pRow->pRight;
valueL=pRow->data;
k=pRow->nCol;
if(k>col-1) break;
}
else
break;
while(pCol->nRow<col)
pCol=pCol->pNext;
valueU=GetUpEle(k,pCol);
if(valueU==0) continue;
pTemp=pTemp->pNext;
while(pTemp->nRow<k)
pTemp=pTemp->pNext;
valueD=GetDiaEle(k,pTemp);
sum+=valueL*valueD*valueU;
}
CNode* pNode=pHead->pNext;
while(pNode->nRow<row)
pNode=pNode->pNext;
while(pNode->pRight!=NULL&&pNode->pRight->nCol<=col)
pNode=pNode->pRight;
if(pNode->nCol==col)
{
pNode->data-=sum;
if(pNode->data==0)
{
DeleteNode(row,col);
return 0;
}
return pNode->data;
}
Add(row,col,-sum);
return -sum;
}
BOOL CRealMatrix::DecomposeEx2()
{
int n=pHead->nRow;
if(n==pHead->nCol&&n!=0)
{
CNode* psrcCurrent=pHead->pNext;
CNode* psrcData=psrcCurrent;
while(psrcCurrent!=pTail)
{
//计算Lij
for(INT j=1;j<=psrcCurrent->nRow-1;++j)
{
CNode* pNode=psrcCurrent;
CNode* pNew=pHead->pNext;
double valueU=GetDown(psrcData->nRow,j);
if(valueU==0) continue;
while(pNew->nRow<j)
pNew=pNew->pNext;
while(pNew->pRight!=NULL&&pNew->pRight->nCol<=j)
pNew=pNew->pRight;
while(pNode->pRight!=NULL&&pNode->pRight->nCol<=j)
pNode=pNode->pRight;
pNode->data/=pNew->data;
}
pData=psrcCurrent;
while(pData->pRight!=NULL&&pData->pRight->nCol<=psrcCurrent->nRow)
pData=pData->pRight;
//计算Dii
psrcData=pData;
double value=GetDia1(psrcCurrent->nRow,psrcCurrent->nRow);
if(value==0) return 1;//对角元为0
psrcCurrent=psrcCurrent->pNext;
psrcData=psrcCurrent;
}
return 2;
}
return 0;
}
double CRealMatrix::GetDia1(INT row,INT col)
{
double sum=0;
double valueU;
CNode* pCol=pHead->pNext;
CNode* pTemp=pHead;
while(pCol->nRow<row)
pCol=pCol->pNext;
for(INT k=1;k<=row-1;++k)
{
valueU=GetUpEle(k,pCol);
if(valueU==0) continue;
sum+=valueU*valueU;
}//#end for
if(pData->nCol==row)
{
pData->data=sqrt(pData->data-sum);
return pData->data;
}
double value=sqrt(-sum);
Add(row,row,value);
return value;
}
double CRealMatrix::GetDown(INT row,INT col)
{
double sum=0;
double valueL,valueU;
CNode* pRow=pHead->pNext;
CNode* pCol=pHead->pNext;
while(pRow->nRow<row)
pRow=pRow->pNext;
for(INT k=1;k<=col-1;++k)
{
if(pRow->pRight!=NULL&&pRow->pRight->nCol<row)
{
pRow=pRow->pRight;
valueL=pRow->data;
k=pRow->nCol;
if(k>col-1) break;
}
else
break;
while(pCol->nRow<col)
pCol=pCol->pNext;
valueU=GetUpEle(k,pCol);
if(valueU==0) continue;
sum+=valueL*valueU;
}
CNode* pNode=pHead->pNext;
while(pNode->nRow<row)
pNode=pNode->pNext;
while(pNode->pRight!=NULL&&pNode->pRight->nCol<=col)
pNode=pNode->pRight;
if(pNode->nCol==col)
{
pNode->data-=sum;
if(pNode->data==0)
{
DeleteNode(row,col);
return 0;
}
return pNode->data;
}
Add(row,col,-sum);
return -sum;
}
BOOL CRealMatrix::GetResult0(CRealMatrix & srcB)
{
INT n=pHead->nRow;
INT m=srcB.pHead->nCol;
BOOL bTrue;
if(n&&n==srcB.pHead->nRow)
{
BackPush0(srcB); //消去
bTrue=Standardize0(srcB); //规格化
FrontPush0(srcB); //回代
return bTrue;
}
return FALSE;
}
void CRealMatrix::BackPush0(CRealMatrix& src)
{
INT m=src.pHead->nCol;
for(INT col=1;col<=m;++col)
BackStep(col,src);
}
void CRealMatrix::BackStep(INT col,CRealMatrix& src)
{
INT n=pHead->nRow;
double *pResult=new double[n+1];
for(INT i=0;i<=n;++i)
pResult[i]=0;
pCurrent=pHead->pNext;
pData=pCurrent;
CNode* psrcCurrent=src.pHead->pNext;
CNode* psrcData=psrcCurrent;
while(pCurrent!=pTail)
{
double sum=0;
while(pData->pRight!=NULL&&pData->pRight->nCol<pCurrent->nRow)
{
pData=pData->pRight;
sum+=pData->data*pResult[pData->nCol];
}
while(psrcData->pRight!=NULL&&psrcData->pRight->nCol<=col)
psrcData=psrcData->pRight;
if(psrcData!=psrcCurrent&&psrcData->nCol==col)
{
psrcData->data-=sum;
pResult[pCurrent->nRow]=psrcData->data;
}
else
{
if(sum!=0)
{
src.Add(psrcCurrent->nRow,col,-sum);
pResult[psrcCurrent->nRow]=-sum;
}
}
pCurrent=pCurrent->pNext;
pData=pCurrent;
psrcCurrent=psrcCurrent->pNext;
psrcData=psrcCurrent;
}//#end while
delete[] pResult;
}
BOOL CRealMatrix::Standardize0(CRealMatrix& src)
{
INT m=src.pHead->nCol;
BOOL bTrue;
for(INT col=1;col<=m;++col)
bTrue=Standard(col,src);
return bTrue;
}
BOOL CRealMatrix::Standard(INT col,CRealMatrix& src)
{
INT n=pHead->nRow;
pCurrent=pHead->pNext;
pData=pCurrent;
CNode* psrcCurrent=src.pHead->pNext;
CNode* psrcData=psrcCurrent;
while(pCurrent!=pTail)
{
while(pData->pRight!=NULL&&pData->pRight->nCol<=pCurrent->nRow)
pData=pData->pRight;
if(pData->nCol!=pCurrent->nRow) return FALSE;
double value=pData->data;
while(psrcData->pRight!=NULL&&psrcData->pRight->nCol<=col)
psrcData=psrcData->pRight;
if(psrcData!=psrcCurrent&&psrcData->nCol==col)
psrcData->data/=value;
pCurrent=pCurrent->pNext;
pData=pCurrent;
psrcCurrent=psrcCurrent->pNext;
psrcData=psrcCurrent;
}
return TRUE;
}
void CRealMatrix::FrontPush0(CRealMatrix& src)
{
INT m=src.pHead->nCol;
for(INT col=1;col<=m;++col)
FrontStep(col,src);
}
void CRealMatrix::FrontStep(INT col,CRealMatrix& src)
{
INT n=pHead->nRow;
double *pResult=new double[n+1];
for(INT i=0;i<=n;++i)
pResult[i]=0;
pCurrent=pTail->pPrev;
pData=pCurrent;
CNode* psrcCurrent=src.pTail->pPrev;
while(psrcCurrent->nRow==0)
psrcCurrent=psrcCurrent->pPrev;
CNode* psrcData=psrcCurrent;
while(pCurrent!=pHead)
{
double sum=0;
while(pData->pRight!=NULL&&pData->pRight->nCol<=pCurrent->nRow)
pData=pData->pRight;
while(pData->pRight!=NULL)
{
pData=pData->pRight;
sum+=pData->data*p
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -