C++ 二维vector协方差,矩阵特征值,最大特征值
时间: 2023-07-17 21:30:02 浏览: 188
每天进步一点点《协方差矩阵的实践》.docx
二维vector协方差:
假设有一个m行n列的矩阵A,其每一列代表一个随机变量的观测值,我们可以使用以下代码来计算每一列之间的协方差。
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
vector<vector<double>> A{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 3行3列的矩阵
int m = A.size(); // 行数
int n = A[0].size(); // 列数
vector<double> mean(n, 0); // 列均值
for (int j = 0; j < n; ++j) {
for (int i = 0; i < m; ++i) {
mean[j] += A[i][j];
}
mean[j] /= m;
}
vector<vector<double>> cov(n, vector<double>(n, 0)); // 协方差矩阵
for (int j = 0; j < n; ++j) {
for (int k = j; k < n; ++k) {
double sum = 0;
for (int i = 0; i < m; ++i) {
sum += (A[i][j] - mean[j]) * (A[i][k] - mean[k]);
}
cov[j][k] = sum / (m - 1);
cov[k][j] = cov[j][k]; // 对称
}
}
for (int j = 0; j < n; ++j) {
for (int k = 0; k < n; ++k) {
cout << cov[j][k] << " ";
}
cout << endl;
}
return 0;
}
```
矩阵特征值和最大特征值:
假设有一个n阶方阵A,其特征值是一个n维向量λ,特征向量是一个n维向量v,满足以下式子:
AV=λV
其中,A是矩阵,V是特征向量矩阵,λ是特征值向量。我们可以使用以下代码计算A的特征值和特征向量,并得到最大特征值。
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
vector<vector<double>> A{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 3行3列的矩阵
int n = A.size(); // 行数(也是列数)
vector<vector<double>> V(n, vector<double>(n, 0)); // 特征向量矩阵
vector<double> lambda(n, 0); // 特征值向量
// 使用Jacobi方法计算特征值和特征向量
while (true) {
double max_off_diag = 0;
int p = 0, q = 0;
for (int j = 0; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
if (abs(A[j][k]) > max_off_diag) {
max_off_diag = abs(A[j][k]);
p = j;
q = k;
}
}
}
if (max_off_diag < 1e-6) {
break;
}
double theta = atan2(2 * A[p][q], A[q][q] - A[p][p]) / 2;
double c = cos(theta);
double s = sin(theta);
vector<vector<double>> B(n, vector<double>(n, 0));
for (int j = 0; j < n; ++j) {
for (int k = 0; k < n; ++k) {
if (j == p && k == p) {
B[j][k] = c;
} else if (j == q && k == q) {
B[j][k] = c;
} else if (j == p && k == q) {
B[j][k] = -s;
} else if (j == q && k == p) {
B[j][k] = s;
} else if (j == k) {
B[j][k] = 1;
}
}
}
A = B * A * trans(B);
}
// 最大特征值
double max_lambda = 0;
for (int i = 0; i < n; ++i) {
if (lambda[i] > max_lambda) {
max_lambda = lambda[i];
}
}
cout << "max eigenvalue: " << max_lambda << endl;
return 0;
}
```
以上代码中使用了Jacobi方法(又称旋转法)来计算特征值和特征向量,它是一种迭代算法。
阅读全文