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

📄 matrixcalculatordlg.cpp

📁 有关的矩阵运算
💻 CPP
📖 第 1 页 / 共 2 页
字号:
*/
// 求矩阵秩的全选主元高斯消去法
void CMatrixCalculatorDlg::OnButton10() 
{
	// 构造矩阵
	CMatrix mtxA;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 求矩阵秩的全选主元高斯消去法
	int nValue = mtxA.RankGauss();
	m_strMatrix3.Format("%d", nValue);

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
5.0,7.0,6.0,5.0
7.0,10.0,8.0,7.0
6.0,8.0,10.0,9.0
5.0,7.0,9.0,10.0
*/
// 对称正定矩阵的乔里斯基分解与行列式的求值
void CMatrixCalculatorDlg::OnButton11() 
{
	// 构造矩阵
	CMatrix mtxA;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 对称正定矩阵的乔里斯基分解与行列式的求值
	double dblValue;
	if (mtxA.DetCholesky(&dblValue))
	{
		m_strMatrix3.Format("行列式值 = %f\r\n\r\n分解后的下三角矩阵为\r\n", dblValue);
		m_strMatrix3 += mtxA.ToString(" ");
	}
	else
		m_strMatrix3 = "求解失败";

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
2.0,4.0,4.0,2.0
3.0,3.0,12.0,6.0
2.0,4.0,-1.0,2.0
4.0,2.0,1.0,1.0
*/
// 矩阵的三角分解
void CMatrixCalculatorDlg::OnButton12() 
{
	// 构造矩阵
	CMatrix mtxA, mtxL, mtxU;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 矩阵的三角分解
	if (mtxA.SplitLU(mtxL, mtxU))
	{
		m_strMatrix3.Format("分解后的L矩阵为\r\n%s\r\n\r\n分解后的U矩阵为\r\n%s", 
			mtxL.ToString(), mtxU.ToString());
	}
	else
		m_strMatrix3 = "求解失败";

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
1.0,1.0,-1.0
2.0,1.0,0.0
1.0,-1.0,0.0
-1.0,2.0,1.0
*/
// 一般实矩阵的QR分解
void CMatrixCalculatorDlg::OnButton13() 
{
	// 构造矩阵
	CMatrix mtxA, mtxQ;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 一般实矩阵的QR分解
	if (mtxA.SplitQR(mtxQ))
	{
		m_strMatrix3.Format("分解后的Q矩阵为\r\n%s\r\n\r\n分解后的R矩阵为\r\n%s", 
			mtxQ.ToString(), mtxA.ToString());
	}
	else
		m_strMatrix3 = "求解失败";

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
1.0,1.0,-1.0
2.0,1.0,0.0
1.0,-1.0,0.0
-1.0,2.0,1.0

1.0,1.0,-1.0,-1.0
2.0,1.0,0.0,2.0
1.0,-1.0,0.0,1.0
*/
// 一般实矩阵的奇异值分解
void CMatrixCalculatorDlg::OnButton14() 
{
	// 构造矩阵
	CMatrix mtxA, mtxU, mtxV;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 一般实矩阵的奇异值分解
	if (mtxA.SplitUV(mtxU, mtxV))
	{
		m_strMatrix3 = "分解后的U矩阵为\n" + mtxU.ToString();
		m_strMatrix3 += "\n\n分解后的V矩阵为\n" + mtxV.ToString();
		m_strMatrix3 += "\n\n分解后的A矩阵为\n" + mtxA.ToString();
	}
	else
		m_strMatrix3 = "求解失败";

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
1.0,2.0,3.0,4.0
6.0,7.0,8.0,9.0
1.0,2.0,13.0,0.0
16.0,17.0,8.0,9.0
2.0,4.0,3.0,4.0
*/
// 求广义逆的奇异值分解法
void CMatrixCalculatorDlg::OnButton15() 
{
	// 构造矩阵
	CMatrix mtxA, mtxU, mtxV, mtxAP;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 求广义逆的奇异值分解法
	if (mtxA.GInvertUV(mtxAP, mtxU, mtxV))
	{
		m_strMatrix3 = mtxAP.ToString();
	}
	else
		m_strMatrix3 = "求解失败";

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
10.0,1.0,2.0,3.0,4.0
1.0,9.0,-1.0,2.0,-3.0
2.0,-1.0,7.0,3.0,-5.0
3.0,2.0,3.0,12.0,-1.0
4.0,-3.0,-5.0,-1.0,15.0
*/
// 约化对称矩阵为对称三对角阵的豪斯荷尔德变换法
void CMatrixCalculatorDlg::OnButton16() 
{
	// 构造矩阵
	CMatrix mtxA, mtxQ, mtxT;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 分配内存
	double *dblB = NULL, *dblC = NULL;
	dblB = new double[mtxA.GetNumColumns()];
	dblC = new double[mtxA.GetNumColumns()];

	// 约化对称矩阵为对称三对角阵的豪斯荷尔德变换法
	if (mtxA.MakeSymTri(mtxQ, mtxT, dblB, dblC))
	{
		m_strMatrix3.Format("乘积矩阵Q为\r\n%s\r\n\r\n三对角阵为\r\n%s", 
			mtxQ.ToString(), mtxT.ToString());
	}
	else
		m_strMatrix3 = "求解失败";

	// 清理内存
	delete[] dblB;
	delete[] dblC;

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
10.0,1.0,2.0,3.0,4.0
1.0,9.0,-1.0,2.0,-3.0
2.0,-1.0,7.0,3.0,-5.0
3.0,2.0,3.0,12.0,-1.0
4.0,-3.0,-5.0,-1.0,15.0
*/
// 实对称三对角阵的全部特征值与特征向量的计算
void CMatrixCalculatorDlg::OnButton17() 
{
	// 构造矩阵
	CMatrix mtxA, mtxQ, mtxT;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 分配内存
	double *dblB = NULL, *dblC = NULL;
	dblB = new double[mtxA.GetNumColumns()];
	dblC = new double[mtxA.GetNumColumns()];

	// 实对称三对角阵的全部特征值与特征向量的计算
	if (mtxA.MakeSymTri(mtxQ, mtxT, dblB, dblC))
	{
		if (mtxA.SymTriEigenv(dblB, dblC, mtxQ))
		{
			int n = mtxQ.GetNumColumns();

			m_strMatrix3.Format("特征值为\r\n");
			CString s;
			for (int i=0; i<n; ++i)
			{
				s.Format("%d: %f\r\n", i+1, dblB[i]);
				m_strMatrix3 += s;
			}

			m_strMatrix3 += "\r\n对应的特征向量为\r\n";
			for (i=0; i<n; ++i)
			{
				s.Format("%d: %s\r\n", i+1, mtxQ.ColToString(i));
				m_strMatrix3 += s;
			}
		}
		else
			m_strMatrix3 = "求解失败";
	}
	else
		m_strMatrix3 = "求解失败";

	// 清理内存
	delete[] dblB;
	delete[] dblC;

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
1.0,6.0,-3.0,-1.0,7.0
8.0,-15.0,18.0,5.0,4.0
-2.0,11.0,9.0,15.0,20.0
-13.0,2.0,21.0,30.0,-6.0
17.0,22.0,-5.0,3.0,6.0
*/
// 约化一般实矩阵为赫申伯格矩阵的初等相似变换法
void CMatrixCalculatorDlg::OnButton18() 
{
	// 构造矩阵
	CMatrix mtxA;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 约化一般实矩阵为赫申伯格矩阵的初等相似变换法
	mtxA.MakeHberg();
	m_strMatrix3 = mtxA.ToString();

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
1.0,6.0,-3.0,-1.0,7.0
8.0,-15.0,18.0,5.0,4.0
-2.0,11.0,9.0,15.0,20.0
-13.0,2.0,21.0,30.0,-6.0
17.0,22.0,-5.0,3.0,6.0
*/
// 求赫申伯格矩阵全部特征值的QR方法
void CMatrixCalculatorDlg::OnButton19() 
{
	// 构造矩阵
	CMatrix mtxA, mtxQ, mtxT;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 建立赫申伯格矩阵
	mtxA.MakeHberg();
	m_strMatrix3.Format("约化得到的赫申伯格矩阵为\r\n%s", mtxA.ToString());

	// 分配内存
	double *dblU = NULL, *dblV = NULL;
	dblU = new double[mtxA.GetNumColumns()];
	dblV = new double[mtxA.GetNumColumns()];

	// 求赫申伯格矩阵全部特征值的QR方法
	if (mtxA.HBergEigenv(dblU, dblV))
	{
		m_strMatrix3 += "\r\n\r\n特征值为\r\n";
		for (int i=0; i<mtxA.GetNumColumns(); ++i)
		{
			CComplex x(dblU[i], dblV[i]);
			m_strMatrix3 += x.ToString() + "\r\n";
		}
	}
	else
		m_strMatrix3 = "求解失败";

	// 清理内存
	delete[] dblU;
	delete[] dblV;

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
2.0,-1.0,0.0
-1.0,2.0,-1.0
0.0,-1.0,2.0
*/
// 求实对称矩阵特征值与特征向量的雅可比法
void CMatrixCalculatorDlg::OnButton20() 
{
	// 构造矩阵
	CMatrix mtxA, mtxV;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 分配内存
	double* dblV = new double[mtxA.GetNumColumns()];

	// 求实对称矩阵特征值与特征向量的雅可比法
	if (mtxA.JacobiEigenv(dblV, mtxV, 100))
	{
		m_strMatrix3.Format("特征值为\r\n");
		CString s;
		for (int i=0; i<mtxA.GetNumColumns(); ++i)
		{
			s.Format("%d: %f\r\n", i+1, dblV[i]);
			m_strMatrix3 += s;
		}

		m_strMatrix3 += "\r\n对应的特征向量为\r\n";
		for (i=0; i<mtxA.GetNumColumns(); ++i)
		{
			s.Format("%d: %s\r\n", i+1, mtxV.ColToString(i));
			m_strMatrix3 += s;
		}
	}
	else
		m_strMatrix3 = "求解失败";

	// 清理内存
	delete[] dblV;

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

/*
10.0,1.0,2.0,3.0,4.0
1.0,9.0,-1.0,2.0,-3.0
2.0,-1.0,7.0,3.0,-5.0
3.0,2.0,3.0,12.0,-1.0
4.0,-3.0,-5.0,-1.0,15.0
*/
// 求实对称矩阵特征值与特征向量的雅可比过关法
void CMatrixCalculatorDlg::OnButton21() 
{
	// 构造矩阵
	CMatrix mtxA, mtxV;

	// 获取数据
	UpdateData();
	mtxA.FromString(m_strMatrix1, ",");

	// 分配内存
	double* dblV = new double[mtxA.GetNumColumns()];

	// 求实对称矩阵特征值与特征向量的雅可比过关法
	if (mtxA.JacobiEigenv2(dblV, mtxV))
	{
		m_strMatrix3.Format("特征值为\r\n");
		CString s;
		for (int i=0; i<mtxA.GetNumColumns(); ++i)
		{
			s.Format("%d: %f\r\n", i+1, dblV[i]);
			m_strMatrix3 += s;
		}

		m_strMatrix3 += "\r\n对应的特征向量为\r\n";
		for (i=0; i<mtxA.GetNumColumns(); ++i)
		{
			s.Format("%d: %s\r\n", i+1, mtxV.ColToString(i));
			m_strMatrix3 += s;
		}
	}
	else
		m_strMatrix3 = "求解失败";

	// 清理内存
	delete[] dblV;

	// 显示数据
	AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -