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

📄 realmatrix.cpp

📁 这是一个实数矩阵计算的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				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 + -