Effacer les filtres
Effacer les filtres

Replacing a zero value of a matrix with the value left to it

1 vue (au cours des 30 derniers jours)
Wietze Zijpp
Wietze Zijpp le 6 Avr 2022
Modifié(e) : DGM le 6 Avr 2022
Suppose I have a matrix
A =
8 1 6
3 0 7
4 9 2
Now I would like the 0 value to be replaced by the value 3 (the value left of it).
This is an illustrative example for a small matrix. I would like to apply this approach to a much larger matrix
  2 commentaires
Torsten
Torsten le 6 Avr 2022
What if there is another 0 left to it ? Or if the 0 is in the first column ?
Wietze Zijpp
Wietze Zijpp le 6 Avr 2022
Good Question, One way to deal with this could be to search for a value which is not and then replace the zeros with that value

Connectez-vous pour commenter.

Réponse acceptée

Star Strider
Star Strider le 6 Avr 2022
One approach using fillmissing
A = [8 1 6
3 0 7
4 9 2];
A(A==0) = NaN;
B = fillmissing(A,'previous',2) % With Original Matrix
B = 3×3
8 1 6 3 3 7 4 9 2
A = [8 1 6
0 0 7
4 9 2];
A(A==0) = NaN;
B = fillmissing(A,'nearest',2) % With Matrix With First Two Rows Being Zero
B = 3×3
8 1 6 7 7 7 4 9 2
It would be necessary to use an if block to test for the second condition and then choose the 'nearest' method for that condition. That could go something like this:
A = [8 1 6
0 0 7
4 9 2
5 0 0];
B = A; % Create Result MAtrix
B(B==0) = NaN;
for k = 1:size(A,1)
ixr = find(A(k,:)==0);
if ~isempty(ixr) & any(ixr==1)
B(k,:) = fillmissing(B(k,:),'nearest',2);
elseif ~isempty(ixr) & ~any(ixr==1)
B(k,:) = fillmissing(B(k,:),'previous',2);
end
end
A
A = 4×3
8 1 6 0 0 7 4 9 2 5 0 0
B
B = 4×3
8 1 6 7 7 7 4 9 2 5 5 5
The loop, and testing each row, seems to me to be the only way to code this, considering that two different interpolation methods are required, depending on the position of the zeros in each row.
.
  1 commentaire
DGM
DGM le 6 Avr 2022
Modifié(e) : DGM le 6 Avr 2022
Well this is way neater than what I came up with, but I can offer this bit of a modification from what I was doing:
A = [8 1 6
0 3 7 % this row uses 'nearest'
4 9 2
5 0 0];
B = [fliplr(A) A]; % book-matched array
B(B==0) = NaN;
B = fillmissing(B,'previous',2);
B = B(:,size(A,2)+1:end) % trim off excess
B = 4×3
8 1 6 3 3 7 4 9 2 5 5 5

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Logical 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!

Translated by