Search code examples
matlabmatrixsparse-matrixleading-zero

MATLAB - Get rid of leading zeros in each row of matrix, 1 at a time?


I want to get rid of leading zeros in each row of a matrix, but limit it to eliminating one zero at a time.

This is my current solution, but is there a simpler way of doing it?

a = [ 0 0 0 0 0 0 0 0 0 0
      0 0 5 2 3 4 0 0 0 0
      0 0 0 1 2 3 4 0 0 0
      0 0 1 2 3 0 0 0 0 0
      0 0 0 0 1 0 0 0 0 0
      1 0 0 0 0 0 0 0 0 0 ]

  b=zeros(size(a));
  for j=1:size(a,2)
  for i=1:size(a,1)
      temp=find(a(i,:),1,'first');
      candelete=min(2,temp);
      b(i,1:end-candelete+1)=a(i,candelete:end);
  end
  a=b
  end

EDIT: I'm want to print every iteration, so that the first output will only have the first leading zero removed:

 0     0     0     0     0     0     0     0     0     0
 0     5     2     3     4     0     0     0     0     0
 0     0     1     2     3     4     0     0     0     0
 0     1     2     3     0     0     0     0     0     0
 0     0     0     1     0     0     0     0     0     0
 1     0     0     0     0     0     0     0     0     0

the second will have 2 zeros removed, and so on...


Solution

  • EDIT: Now that the question was clarified, here's a better answer using circshift:

    index = (a(:, 1) == 0) & any(a, 2);
    while any(index)
      a(index, :) = circshift(a(index, :), -1, 2);
      disp(a);
      index = (a(:, 1) == 0) & index;
    end