filling the first NaN right after the last non NaN with a value that is half of the non NaN
1 次查看(过去 30 天)
显示 更早的评论
Hello there, could you help to make the following matrix p = [NaN 2 NaN; 2 4 NaN; 2 6 8; NaN 8 2; NaN NaN 1; NaN NaN 1] into p1 , which equals [NaN 2 NaN; 2 4 NaN; 2 6 8; 1 8 2; NaN 4 1; NaN NaN 1]...by filling the first NaN right after the last non NaN with a value that is half of the non NaN. Waiting for any answers from you . Thank you.
Best , Jessie
0 个评论
回答(1 个)
Robert
2015-11-30
You can use the function isnan to find the appropriate values to replace as in the following code:
p = [
NaN 2 NaN;
2 4 NaN;
2 6 8;
NaN 8 2;
NaN NaN 1;
NaN NaN 1
];
p1 = p(1:end-1,:); % NaN replacement sources
p2 = p(2:end,:); % NaN replacement candidates
replace = isnan(p2) & ~isnan(p1);
p2(replace) = p1(replace)/2; % replace the NaN's that met your criteria
p2 = [p(1,:);p2]; % put back the first row, which never changes
disp(p2)
This code yields your expected result for your example. I am not completely certain what you expect to happen for NaN's with preceding values that aren't the last in the column. If you want to leave those as NaN and not replace them, you will need an additional step. After creating the logical indices variable, replace, use the following code to keep only the last true value in each column.
replace = replace & flipud(cumsum(flipud(replace)))==1;
You can use this test value to see the difference in the two interpretations.
p = [
NaN 2 NaN;
2 4 NaN;
2 6 8;
NaN 8 NaN;
NaN NaN 2;
NaN NaN NaN
];
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 NaNs 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!