使用犰狳忽略均值和其他统计函数中的 NaN

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

如果矩阵包含

NaN
值,Armadillo 将返回
NaN
,以对包含这些
NaN
的列/行执行统计。 IE。以下代码

arma::mat A = {{1, 2, 3}, {6, 7, 8}, {4, 9, 10}};
A(1,1) = arma::datum::nan;
std::cout << A << "\n";
std::cout << arma::mean(A) << "\n" << arma::mean(A, 1);

会回来

1.0000    2.0000    3.0000
6.0000       nan    8.0000
4.0000    9.0000   10.0000

3.6667      nan   7.0000

2.0000
   nan
7.6667

是否有一种有效的方法来忽略

NaN
值,就像 MATLAB 的
nanmean()
/
mean(-, 'omitnan')
一样?

列均值将返回 5.5,行均值将返回 7,而不是

NaN

c++ armadillo
1个回答
0
投票

我们可以使用子矩阵视图来实现这个目标。

就像我在这个问题下的回答一样。

例如,这是代码。

// Replace the NaN in the current column with the average
void ImputeColWithMean(arma::vec& col_vec) {
    // Get the non-NaN element index of the current column
    arma::uvec indices = arma::find_finite(col_vec);

    // Calculate the mean of non-NaN elements in the current column
    double col_mean = arma::mean(col_vec.elem(indices));

    // Replace the NaN in the current column with the average
    col_vec.replace(arma::datum::nan, col_mean);
}

int main(){
   // Here is the matrix
   arma::mat A{{1, arma::datum::nan}, {arma::datum::nan, 2}, {3, 2}};
   
   // Perform operations on each column of the matrix
   A.each_col([](arma::vec& vec) { ImputeWithMean(vec); });

   return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.