Counting zeros which are lying between nonzero elements by considering consecutive zeros as a single element in a matrix

4 visualizaciones (últimos 30 días)
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]
A = 4×8
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?

Respuestas (5)

Mahdi Hayati
Mahdi Hayati el 27 de Ag. de 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

Bruno Luong
Bruno Luong el 27 de Ag. de 2023
Editada: Bruno Luong el 27 de Ag. de 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]
A = 4×8
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)
ans = 4×1
2 2 0 2

Bruno Luong
Bruno Luong el 27 de Ag. de 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]
A = 4×8
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
count = 4×1
2 2 0 2

Matt J
Matt J el 27 de Ag. de 2023
Editada: Matt J el 27 de Ag. de 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]
A = 4×8
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) ))
result = 4×1
2 2 0 2
  4 comentarios
Bruno Luong
Bruno Luong el 27 de Ag. de 2023
Editada: Bruno Luong el 27 de Ag. de 2023
It seems not correct with A contains only 0
A = [0 0 0 0]
A = 1×4
0 0 0 0
d=diff(A,1,2);
result= min( sum(d==-1,2) - ~A(:,end), sum(d==1,2) - ~A(:,1) )
result = -1

Iniciar sesión para comentar.


Bruno Luong
Bruno Luong el 28 de Ag. de 2023
Editada: Bruno Luong el 28 de Ag. de 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]
A = 4×8
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)
ans = 4×1
2 2 0 2
% If A is binary you can simplify to
% max(sum(diff(A,1,2)==1,2)-~A(:,1),0)

Categorías

Más información sobre Specifying Target for Graphics Output en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by