在MATLAB中用其他值(平均值)替换NaN

时间:2017-11-16 21:53:19

标签: matlab matrix nan

我有矩阵A,例如:

A = [1  2  3 NaN;
     1 NaN 2 NaN;
     NaN 2 3 4]

我想用预定义的值替换NaN中的每个A,例如我的列vector B

B = [2; 1.5; 3]

因此,对于第二行,我想获得一个新矩阵,其中此特定行中的每个NaN都被1.5替换。它将在第一行2和第三行3

除了循环遍历整个矩阵之外,还有更好的方法吗?我在forif条件下使用else循环。但是,此解决方案执行速度不快。

3 个答案:

答案 0 :(得分:5)

以下是使用repelem的解决方案(在R2015a中引入)。诀窍是根据B每行NaN出现的次数重复A的条目。

req = A.';
req(isnan(req)) = repelem(B, sum(isnan(req)));
req = req.';

如果您还想计算B,请使用mean'omitnan' flag(在R2015a中引入),即

B = mean(A,2,'omitnan');

答案 1 :(得分:4)

您可以这样做:

is_NaN = find(isnan(A) > 0); % find index of NaNs
[I,~] = ind2sub(size(A), is_NaN); %transform from linear index to sub index
A(is_NaN) = B(I); % replace all using the row number of each found index

答案 2 :(得分:0)

你在这里:

$directory = explode('/', getcwd());
if( end($directory) == 'it' ){
    //call Italian Module
}else{
    //call English Module
}

由于您在谈论问题标题中的行均值,我认为不能手动定义向量A = [ 1 2 3 NaN; 1 NaN 2 NaN; NaN 2 3 4 ]; B = [2; 1.5; 3]; B = repmat(B,1,size(A,2)); idx = isnan(A); A(idx) = B(idx); ,而应该从您的B矩阵计算出来。所以:

A