📄 matrixcalculatordlg.cpp
字号:
*/
// 求矩阵秩的全选主元高斯消去法
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 + -