如果矩阵包含
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
。
我们可以使用子矩阵视图来实现这个目标。
就像我在这个问题下的回答一样。
例如,这是代码。
// 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;
}