特征库中标准差的列初始化和计算
Column wise initialization and calculation of standard deviation in eigen library
我编写了一个 MATLAB 代码,我正在尝试使用 Eigen 在 C++ 中完成它library.In我的 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 库获取标准偏差?
I am confused on using .colwise()
您可能想改用 .col(i)
。
Is there an in built function to get standard deviation using Eigen library?
没有,因为这个TODO List中似乎列出了标准差函数。
正如Yuyao指出的那样,Eigen中没有内置标准差函数(目前)。您可以使用以下方法为单个向量计算此值(通常,如果您在 element-wise 操作上工作更多,则更喜欢使用 Array
):
Eigen::ArrayXd vec;
double std_dev = std::sqrt((vec - vec.mean()).square().sum()/(vec.size()-1));
(因为有编辑请求:请注意,对于标准偏差的 un-biased 估计,您需要除以 vec.size()-1
:[1])
如果你想计算整个数组的 column-wise 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";
我编写了一个 MATLAB 代码,我正在尝试使用 Eigen 在 C++ 中完成它library.In我的 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 库获取标准偏差?
I am confused on using
.colwise()
您可能想改用 .col(i)
。
Is there an in built function to get standard deviation using Eigen library?
没有,因为这个TODO List中似乎列出了标准差函数。
正如Yuyao指出的那样,Eigen中没有内置标准差函数(目前)。您可以使用以下方法为单个向量计算此值(通常,如果您在 element-wise 操作上工作更多,则更喜欢使用 Array
):
Eigen::ArrayXd vec;
double std_dev = std::sqrt((vec - vec.mean()).square().sum()/(vec.size()-1));
(因为有编辑请求:请注意,对于标准偏差的 un-biased 估计,您需要除以 vec.size()-1
:[1])
如果你想计算整个数组的 column-wise 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";