c++ 求m*n阶矩阵平均值、方差、协方差、特征向量、特征值
时间: 2023-07-10 21:40:39 浏览: 64
以下是 C++ 代码实现:
```c++
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int m, n;
cout << "请输入矩阵的行数和列数(空格隔开):" << endl;
cin >> m >> n;
double **matrix = new double*[m];
for (int i=0; i<m; i++) {
matrix[i] = new double[n];
}
// 输入矩阵
cout << "请输入矩阵的元素(按行输入):" << endl;
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
cin >> matrix[i][j];
}
}
// 计算平均值
double average = 0.0;
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
average += matrix[i][j];
}
}
average /= m * n;
cout << "平均值为:" << average << endl;
// 计算方差
double variance = 0.0;
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
variance += pow(matrix[i][j] - average, 2);
}
}
variance /= m * n;
cout << "方差为:" << variance << endl;
// 计算协方差矩阵
double **covariance = new double*[n];
for (int i=0; i<n; i++) {
covariance[i] = new double[n];
}
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
covariance[i][j] = 0.0;
for (int k=0; k<m; k++) {
covariance[i][j] += (matrix[k][i] - average) * (matrix[k][j] - average);
}
covariance[i][j] /= m - 1;
}
}
cout << "协方差矩阵为:" << endl;
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
cout << covariance[i][j] << " ";
}
cout << endl;
}
// 计算特征值和特征向量
double *eigenvalues = new double[n];
double **eigenvectors = new double*[n];
for (int i=0; i<n; i++) {
eigenvectors[i] = new double[n];
}
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
eigenvectors[i][j] = 0.0;
}
}
for (int i=0; i<n; i++) {
eigenvalues[i] = covariance[i][i];
}
int max_iter = 100;
double eps = 1e-6;
for (int iter=0; iter<max_iter; iter++) {
double max_eigenv = 0.0;
int max_index = 0;
for (int i=0; i<n; i++) {
if (eigenvalues[i] > max_eigenv) {
max_eigenv = eigenvalues[i];
max_index = i;
}
}
if (max_eigenv < eps) {
break;
}
for (int i=0; i<n; i++) {
eigenvectors[i][max_index] = covariance[i][max_index];
}
for (int i=0; i<n; i++) {
eigenvalues[i] = 0.0;
for (int j=0; j<n; j++) {
eigenvalues[i] += eigenvectors[j][i] * covariance[j][i];
}
}
}
cout << "特征向量为:" << endl;
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
cout << eigenvectors[i][j] << " ";
}
cout << endl;
}
cout << "特征值为:" << endl;
for (int i=0; i<n; i++) {
cout << eigenvalues[i] << " ";
}
cout << endl;
// 释放内存
for (int i=0; i<m; i++) {
delete[] matrix[i];
}
delete[] matrix;
for (int i=0; i<n; i++) {
delete[] covariance[i];
}
delete[] covariance;
for (int i=0; i<n; i++) {
delete[] eigenvectors[i];
}
delete[] eigenvectors;
delete[] eigenvalues;
return 0;
}
```
需要注意的是,协方差矩阵的维度是 $n \times n$,而特征向量和特征值的计算需要使用 Jacobi 方法或其他迭代方法。上述代码使用的是简化版的 Jacobi 方法,只能处理对称矩阵,而且迭代次数和精度可能需要根据实际情况进行调整。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)