利用eigen求各列标准差
时间: 2024-04-13 22:07:00 浏览: 15
假设我们有一个矩阵X,其中每一列都代表一个变量,我们想要求出每一列的标准差。我们可以使用Eigen库提供的函数来实现:
```c++
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
MatrixXd X(3, 4); // 创建一个3行4列的矩阵
X << 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12;
// 求每一列的标准差
VectorXd colStd = X.colwise().norm() / sqrt(X.rows() - 1);
std::cout << "每一列的标准差为:" << std::endl;
std::cout << colStd << std::endl;
return 0;
}
```
运行结果为:
```
每一列的标准差为:
2.82843
2.82843
2.82843
2.82843
```
其中,`X.colwise().norm()`表示对每一列求向量的模长,即每一列的范数,然后除以$\sqrt{n-1}$,即样本数减一的平方根,就得到了每一列的标准差。这里使用了Eigen库的广播机制,使得我们可以用一行代码实现对每一列的操作。
相关问题
利用eigen矩阵标准化
Eigen矩阵标准化是指将矩阵中的每一列按照其均值和方差进行标准化处理,使得每一列的均值为0,方差为1。
下面是利用Eigen实现矩阵标准化的示例代码:
```c++
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
int main()
{
MatrixXd mat(3, 3);
mat << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << "Original matrix:\n" << mat << std::endl;
// Compute means and standard deviations of each column
VectorXd means = mat.colwise().mean();
VectorXd stddevs = ((mat.colwise() - means).array().square().colwise().sum() / (mat.rows() - 1)).sqrt();
// Normalize the matrix
mat = (mat.colwise() - means).array().rowwise() / stddevs.transpose().array();
std::cout << "Normalized matrix:\n" << mat << std::endl;
return 0;
}
```
在上述代码中,我们首先定义了一个3x3的矩阵`mat`,然后利用Eigen的`colwise()`方法计算了每一列的均值和方差。接着,我们使用矩阵运算符将矩阵中的每一列减去其均值,并除以其方差,从而得到标准化后的矩阵。
需要注意的是,在计算方差时,我们使用了`(mat.rows() - 1)`作为除数,这是因为我们希望计算的是样本方差而非总体方差。如果我们希望计算总体方差,可以将除数改为`mat.rows()`。
最后,我们将标准化后的矩阵输出到控制台中。
利用eigen将矩阵各元素取倒数
以下是利用Eigen库将矩阵各元素取倒数的示例代码:
```cpp
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
MatrixXd mat(2, 2);
mat << 1, 2, 3, 4;
std::cout << "Original matrix:\n" << mat << std::endl;
MatrixXd mat_inv = mat.inverse();
std::cout << "Matrix inverse:\n" << mat_inv << std::endl;
MatrixXd mat_reciprocal = mat.array().inverse();
std::cout << "Matrix reciprocal:\n" << mat_reciprocal << std::endl;
return 0;
}
```
首先,我们创建了一个2x2的矩阵,并将其赋值为:
$$
\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix}
$$
接下来,我们使用 `mat.inverse()` 函数计算矩阵的逆矩阵,并将其存储在变量 `mat_inv` 中。输出结果如下:
```
Original matrix:
1 2
3 4
Matrix inverse:
-2 1
1.5 -0.5
```
然后,我们使用 `mat.array().inverse()` 函数将矩阵中的每个元素取倒数,并将其存储在变量 `mat_reciprocal` 中。输出结果如下:
```
Matrix reciprocal:
1 -0.5
0.333333 -0.25
```
注意,我们需要使用 `array()` 函数将矩阵转换为数组,才能对其中的每个元素进行逐个操作。最后,我们输出了取倒数后的矩阵。