How to replace zero elements with the mean of the closest previous and following values?
8 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
for example, given matrix A:
A=[2 0 3 -1 6; -1 -2 3 5 0; 2 3 4 -1 7; 5 1 0 0 4; 0 1 5 0 -2];
I want to obtain this:
A=[2 2.5 3 -1 6; -1 -2 3 5 4; 2 3 4 -1 7; 5 1 2.5 2.5 4; 3 1 5 1.5 -2]
if zero element hasn't previous elements I want the mean between the two following elements
if zero element hasn't following elements I want the mean between the two previous elements
thanks
0 commentaires
Réponse acceptée
Rik
le 17 Nov 2018
The code below doesn't average the non-zero above and below for each row, but gets the closest non-zero, with a bias towards the later values.
A=[2 0 3 -1 6; -1 -2 3 5 0; 2 3 4 -1 7; 5 1 0 0 4; 0 1 5 0 -2];
for row=1:size(A,1)
zeropos=A(row,:)==0;
if any(zeropos)
zeropos=find(zeropos);
non_zero=1:size(A,2);non_zero(zeropos)=[];
%Use implicit expansion to replicate for multiple zeros, and
%subtract a small value to force [5 1 0 0 4] to do (1+4)/2
[~,idx]=sort(abs(non_zero'-zeropos-.1));
idx=non_zero(idx(1:2,:));
if size(idx,1)==1,idx=idx';end%flip if only 1 zero
A(row,zeropos)=(A(row,idx(1,:))+A(row,idx(2,:)))/2;
end
end
%check
B=[2 2.5 3 -1 6; -1 -2 3 5 4; 2 3 4 -1 7; 5 1 2.5 2.5 4; 3 1 5 1.5 -2];
IsCorrect=~any(abs(A(:)-B(:))>2*eps)
1 commentaire
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Surfaces, Volumes, and Polygons dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!