Replace zero in a matrix with value in previous row
显示 更早的评论
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.
采纳的回答
更多回答(5 个)
Shivaputra Narke
2014-2-1
1 个投票
Now answer to your comment...
while(all(a(:))) a(find(a==0))=a(find(a==0)-1) end
3 个评论
Mohit
2014-2-1
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.
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));
Shivaputra Narke
2014-2-1
0 个投票
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';
Paul
2014-2-1
idx=find(A==0)
A(idx)=A(idx-1)
3 个评论
Amit
2014-2-1
This solution is similar to what Shivaputra posted. This solution will also fail. find(A==0) give linear indexing. Imaging that you have first row with some values 0. This approach will fill up those first row values with a value too.
Try these solution for a matrix like:
A = [1 0 0;2 1 0;2 3 1]
Shivaputra Narke
2014-2-1
Thank you Amit. My solution wont work on such scenarios.
Mohit
2014-2-1
类别
在 帮助中心 和 File Exchange 中查找有关 Matrices and Arrays 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!