用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 vectorB
:
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