Counting zeros which are lying between nonzero elements by considering consecutive zeros as a single element in a matrix
    10 views (last 30 days)
  
       Show older comments
    
I have a (4x8) matrix as 
A=[1 0 1 1 1 0 0 1;0 1 0 1 1 0 1 0;0 0 1 0 0 0 0 0;1 0 1 1 0 0 1 1]
I want to calculate the number of only those zeros that are lying between nonzero elements i.e 1  in each row in such a way that  I want to consider only the consecutive zeros as a single element. Single zeros will be considered as a separate element. Desired Output is (2 2 0 2). How to do so?
0 Comments
Answers (5)
  Mahdi Hayati
 on 27 Aug 2023
        Hi.
you can use diff() function to find number of times that elements of each row, turn from 1 to 0. for example for the first row we can have:
D = diff(A(1,:));
temp = size(find(D == -1));
number_of_turns = temp(1);
if D(7) == -1
    number_of_turns = number_of_turns - 1;
end
number_of_turns
in this code, I found how many times zeros are stuck between ones. The 'if' statement is because if the last element of the row is 0, it must not be count.
I hope it was useful
0 Comments
  Bruno Luong
      
      
 on 27 Aug 2023
        
      Edited: Bruno Luong
      
      
 on 27 Aug 2023
  
      A=[1 0 1 1 1 0 0 1;0 1 0 1 1 0 1 0;0 0 1 0 0 0 0 0;1 0 1 1 0 0 1 1]
d=diff(A~=0,1,2);
[~,i,v]=find(d');
vl=zeros(size(A,1),1);
vl(i)=v;
sum(d==-1,2)-(vl==-1)
0 Comments
  Bruno Luong
      
      
 on 27 Aug 2023
        Always helpful the old for-loop
A=[1 0 1 1 1 0 0 1;0 1 0 1 1 0 1 0;0 0 1 0 0 0 0 0;1 0 1 1 0 0 1 1]
[m,n] = size(A);
count = zeros(m,1);
for i = 1:m
    s0startded = false;
    c = 0;
    isprevnull = A(i,1) == 0;
    for j = 2:n
        isnull = A(i,j) == 0;
        if s0startded
            if ~isnull
                c = c+1;
                s0startded = false;
            end
        else
            s0startded = isnull && ~isprevnull;
        end
        isprevnull = isnull;
    end
    count(i) = c;
end
count
0 Comments
  Matt J
      
      
 on 27 Aug 2023
        
      Edited: Matt J
      
      
 on 27 Aug 2023
  
      A=[1 0 1 1 1 0 0 1;0 1 0 1 1 0 1 0;0 0 1 0 0 0 0 0;1 0 1 1 0 0 1 1]
d=diff(A,1,2);
result= max(0,  min( sum(d==-1,2) - ~A(:,end), sum(d==1,2) - ~A(:,1)  ))
4 Comments
  Bruno Luong
      
      
 on 27 Aug 2023
				
      Edited: Bruno Luong
      
      
 on 27 Aug 2023
  
			It seems not correct with A contains only 0 
A = [0 0 0 0]
d=diff(A,1,2);
result= min( sum(d==-1,2) - ~A(:,end), sum(d==1,2) - ~A(:,1)  )
  Bruno Luong
      
      
 on 28 Aug 2023
        
      Edited: Bruno Luong
      
      
 on 28 Aug 2023
  
      A=[1 0 1 1 1 0 0 1;0 1 0 1 1 0 1 0;0 0 1 0 0 0 0 0;1 0 1 1 0 0 1 1]
max(sum(diff(~~A,1,2)==1,2)-~A(:,1),0)
% If A is binary you can simplify to
% max(sum(diff(A,1,2)==1,2)-~A(:,1),0)
0 Comments
See Also
Categories
				Find more on Encryption / Cryptography in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


