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

用MATLAB中的其他值(平均值)替换NaN,matlab,matrix,nan,Matlab,Matrix,Nan,我有矩阵A,例如: A = [1 2 3 NaN; 1 NaN 2 NaN; NaN 2 3 4] 我想用预定义值替换A中的每个NaN,例如my columns vectorB: B = [2; 1.5; 3] 对于第二行,我想得到一个新的矩阵,其中这一行中的每个NaN都被1.5替换。第一行是2,第三行是3 除了在整个矩阵中循环外,还有更好的方法吗?我使用了带有if和else条件的for循环。但是,此解决方案的执行速度不是很快。给您: A = [ 1 2 3

我有矩阵
A
,例如:

A = [1  2  3 NaN;
     1 NaN 2 NaN;
     NaN 2 3 4]
我想用预定义值替换
A
中的每个
NaN
,例如my columns vector
B

B = [2; 1.5; 3]
对于第二行,我想得到一个新的矩阵,其中这一行中的每个NaN都被
1.5
替换。第一行是
2
,第三行是
3

除了在整个矩阵中循环外,还有更好的方法吗?我使用了带有
if
else
条件的
for
循环。但是,此解决方案的执行速度不是很快。

给您:

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
矩阵中计算出来。因此:

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

B = repmat(nanmean(A,2),1,size(A,2));

idx = isnan(A);
A(idx) = B(idx);
以下是使用(R2015a中介绍的)的解决方案。诀窍是根据
NaN
A
的每一行中出现的次数,重复
B
的条目

req = A.';
req(isnan(req)) = repelem(B, sum(isnan(req)));
req = req.';
如果您还想计算
B
,请使用
mean
和(R2015a中介绍的)即


您可以按如下方式进行操作:

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

nanmean
需要统计和机器学习工具箱。您可以将前两个步骤组合成
[I,~]=find(isnan(A))
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