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

조회 수: 2 (최근 30일)
Wietze Zijpp
Wietze Zijpp 2022년 4월 6일
편집: DGM 2022년 4월 6일
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
Torsten
Torsten 2022년 4월 6일
What if there is another 0 left to it ? Or if the 0 is in the first column ?
Wietze Zijpp
Wietze Zijpp 2022년 4월 6일
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

댓글을 달려면 로그인하십시오.

채택된 답변

Star Strider
Star Strider 2022년 4월 6일
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
DGM
DGM 2022년 4월 6일
편집: DGM 2022년 4월 6일
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

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Resizing and Reshaping Matrices에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by