特征库中的按列初始化和标准差计算

问题描述 投票:0回答:3

我编写了一个 MATLAB 代码,并尝试使用 Eigen 库在 C++ 中实现它。在我的 MATLAB 代码中,我必须执行这样的特定函数

M=10;
s1 = zeros(20,M);
for i=1:M
  s1(:,i) = i*i;%some function 
  s1(:,i) = s1(:,i)/std(s1(:,i));
end

我对使用 .colwise() 感到困惑,是否有内置函数可以使用 Eigen 库获取标准差?

c++ matlab eigen3
3个回答
12
投票

正如 Yuyao 指出的,Eigen 中目前还没有内置标准差函数。您可以使用以下方法计算单个向量的值(通常,如果您更多地进行元素操作,则更喜欢使用

Array
):

Eigen::ArrayXd vec;
double std_dev = std::sqrt((vec - vec.mean()).square().sum()/(vec.size()-1));

(由于有编辑请求:请注意,为了对标准差进行无偏估计,您需要除以

vec.size()-1
[1]

如果你想计算整个数组的按列std-dev,以下应该可以工作:

Eigen::Index N = 20, M = 10;
Eigen::ArrayXd angles = Eigen::ArrayXd::LinSpaced(N, -M_PI/2, M_PI/2);

Eigen::ArrayXXd s1(N, M);
for(Eigen::Index i=0; i< s1.cols(); ++i)
{
    s1.col(i) = (i+1)*sin(angles+i);
}

Eigen::Array<double, 1, Eigen::Dynamic> std_dev = ((s1.rowwise() - s1.colwise().mean()).square().colwise().sum()/(M-1)).sqrt();
std::cout << std_dev << "\n\n";

s1.rowwise() /= std_dev;

std::cout << s1 << "\n\n";

0
投票

我对使用感到困惑

.colwise()

您可能想使用

.col(i)
来代替。

是否有内置函数可以使用 Eigen 库获取标准差?

不,因为标准差函数似乎列在这个TODO列表中。


0
投票

现在,如果你想获得矩阵中每一列的标准差。

例如,你的

matrix
stdev_vector
是这样的:

Eigen::MatrixXd matrix;
Eigen::RowVectorXd stdev_vector;

然后,您可以编写代码来获取标准差,如下所示:

stdev_vector = ((matrix.rowwise() - matrix.colwise().mean()).colwise().squaredNorm() / (matrix.rows() - 1)).cwiseSqrt()

注意

Eigen::Array
Eigen::Matrix

之间的区别
© www.soinside.com 2019 - 2024. All rights reserved.