C++程序 查找矩阵的正常值和痕迹
在矩阵的运算中,有两个常用的指标:矩阵的正常值和矩阵的痕迹。矩阵的正常值是指矩阵中若干个互不相同特征值的平方和,而矩阵的痕迹则是指矩阵对角线元素的和。在本篇文章中,我们将通过C++程序演示如何查找矩阵的正常值和痕迹。
矩阵的正常值
矩阵的正常值是指矩阵中若干个互不相同特征值的平方和。下面是C++程序中用于查找矩阵的正常值的代码:
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN = 100;
double a[MAXN][MAXN], ev[MAXN], nv[MAXN]; // a表示矩阵,ev表示特征值,nv表示正常值
int n;
int gauss() {
int c, r;
for (c = 0, r = 0; c < n; c++) {
int t = r;
for (int i = r; i < n; i++)
if (abs(a[i][c]) > abs(a[t][c]))
t = i;
if (abs(a[t][c]) < 1e-8)
continue;
for (int i = c; i <= n; i++)
swap(a[t][i], a[r][i]);
double k = a[r][c];
for (int i = c; i <= n; i++)
a[r][i] /= k;
for (int i = r + 1; i < n; i++) {
k = a[i][c] / a[r][c];
for (int j = c; j <= n; j++)
a[i][j] -= k * a[r][j];
}
r++;
}
if (r < n)
for (int i = r; i < n; i++)
if (abs(a[i][n]) > 1e-8)
return 2;
for (int i = n - 1; i >= 0; i--) {
nv[i] = a[i][n];
for (int j = i + 1; j < n; j++)
nv[i] -= a[i][j] * nv[j];
}
return 0;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
for (int i = 0; i < n; i++)
a[i][n] = nv[i] = 0;
for (int i = 1; i <= n; i++) {
a[i - 1][n] = pow(-1, i + 1);
if (gauss())
printf("The matrix is not normal.\n");
else {
ev[i - 1] = nv[i - 1];
printf("lambda[%d] = %lf\n", i, ev[i - 1]);
}
}
double ans = 0;
for (int i = 0; i < n; i++)
ans += ev[i] * ev[i];
printf("The matrix's normal value is: %lf\n", ans);
return 0;
}
上述代码中,我们使用了高斯消元法来求解矩阵的特征值和正常值。首先,我们输入了矩阵的维数以及矩阵的所有元素,然后按照高斯消元法的步骤,求解出矩阵的所有特征值,最后根据公式tr(A) = \sum_{i=1}^n\lambda_i求解出矩阵的正常值。
在上述代码中,我们使用了以下变量:
- a:nxn的矩阵2. ev:长度为n的数组,用于存储特征值。
- nv:长度为n的数组,用于存储正常值。
- n:矩阵的维数。
需要注意的是,在输入矩阵后,我们需要将a矩阵中的最后一列初始化为0,以便执行高斯消元法。同时,我们还需要给a矩阵的最后一列赋值为正负交替的1,-1,1,-1…以便求解出每一个特征值。
矩阵的痕迹
矩阵的痕迹是指矩阵对角线元素的和。以下是C++程序中用于查找矩阵的痕迹的代码:
#include <iostream>
using namespace std;
const int MAXN = 100;
int a[MAXN][MAXN]; // a表示矩阵
int n;
int main() {
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
int ans = 0;
for (int i = 0; i < n; i++)
ans += a[i][i];
printf("The matrix's trace is: %d\n", ans);
return 0;
}
上述代码中,我们直接按照矩阵的定义求解出了矩阵的痕迹。需要注意的是,在输入矩阵过程中,我们仍然使用了nxn的数组a来存储矩阵。
结论
通过本篇文章,我们了解了如何使用C++程序来查找矩阵的正常值和痕迹。对于矩阵运算来说,这是基础而重要的指标,在学习线性代数和矩阵运算时,应该注意掌握其具体实现方法。