Replace zero in a matrix with value in previous row
    조회 수: 18 (최근 30일)
  
       이전 댓글 표시
    
Hi,
Can you please help me on how can I replace all zeroes in a matrix with the value in previous row?
e.g. if value in row 3 column 4 is 0, it should pick value in row 2 column 4.
I can do it using a for loop but I dont want to use that.
Thanks.
댓글 수: 0
채택된 답변
  Azzi Abdelmalek
      
      
 2014년 2월 1일
        
      편집: Azzi Abdelmalek
      
      
 2014년 2월 1일
  
      A=[1 2 3 4;4 5 0 0;1 0 0 1 ;0 1 1 1]
while any(A(:)==0)
  ii1=A==0;
  ii2=circshift(ii1,[-1 0]);
  A(ii1)=A(ii2);
end
댓글 수: 4
  Jan
      
      
 2016년 11월 4일
				@Mido: Please open a new thread for a new question.
match       = (A(:, 3)==0);
A(match, 3) = A(match, 2);
추가 답변 (5개)
  Shivaputra Narke
      
 2014년 2월 1일
        Now answer to your comment...
while(all(a(:))) a(find(a==0))=a(find(a==0)-1) end
댓글 수: 3
  Captain Karnage
      
 2022년 12월 2일
				That expression doesn't work as written in a single line. Without a ; after the assignment, it gets an error 'Error: Illegal use of reserved keyword "end".` If I add the ; however, it doesn't error but it still doesn't work. I'm not sure why, because logically it seems like it should, but I just get the original a out when I run it.
  DGM
      
      
 2022년 12월 3일
				
      편집: DGM
      
      
 2022년 12월 3일
  
			The loop is never entered at all.  You could make some modifications. 
a = [0 5 9 13; 2 6 0 0; 3 0 0 15; 0 8 12 16]
na = numel(a);
while ~all(a(:)) % loop runs until there are no zeros
    idx = find(a==0);
    a(idx) = a(mod(idx-2,na)+1);
end
a
The redundant find() can be removed.  Since this is based on decrementing the linear indices, this will fill zeros at the top of a column with content from the bottom of the prior column.  Using mod() allows the wrapping behavior to extend across the ends of the array.  Note that a(1,1) is filled from a(16,16).
Whether this wrapping behavior is intended or acceptable is a matter for the reader to decide.
  Andrei Bobrov
      
      
 2014년 2월 1일
        l = A == 0;
ii = bsxfun(@plus,size(A,1)*(0:size(A,2)-1),cumsum(~l));
out = A;
out(l) = A(ii(l));
댓글 수: 0
  Shivaputra Narke
      
 2014년 2월 1일
        May be this code can help...
% where a is your matrix a(find(a==0))=a(find(a==0)-1)
  Amit
      
 2014년 2월 1일
        Lets say your matrix is A
[m,n] = size(A);
An = A';
valx = find(~An); % This will give you zeros elements linear index
valx = valx(valx-n > 0);
An(valx) = An(valx-n);
A = An';
참고 항목
카테고리
				Help Center 및 File Exchange에서 Matrices and Arrays에 대해 자세히 알아보기
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!