How can I quantify the number of cells between specific values?

2 visualizaciones (últimos 30 días)
omidm
omidm el 9 de Dic. de 2022
Comentada: omidm el 9 de Dic. de 2022
I have a 100x1500 array [A] filled with zeros and ones.
For example, A(1,:) = 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1....
For each row, I would like to find the average distance, or average number of zeros, between ones. Is there a simple way to do this?
  3 comentarios
omidm
omidm el 9 de Dic. de 2022
I'd like to ignore the leading and trailing zeros, so just the mean of [1 2] in your example. Thanks for clarifying.
Voss
Voss el 9 de Dic. de 2022
Editada: Voss el 9 de Dic. de 2022
@omidm: How should consecutive ones be treated? That is, should they be considered as having a run of zero zeros in between them? Consider:
A = [1 0 1 1 0 0 0 1]
Is that a sequence of 1 zero followed by a sequence of 3 zeros (average length 2), or is it a sequence of 1 zero followed by a sequence of 0 zeros followed by a sequence of 3 zeros (average length 4/3)?

Iniciar sesión para comentar.

Respuesta aceptada

Voss
Voss el 9 de Dic. de 2022
A = [0 0 1 0 0 0 0 1 1 0
1 0 1 0 0 0 1 1 0 0
0 1 1 1 0 0 1 0 1 0
1 0 0 0 1 1 1 0 1 0
1 1 1 0 1 0 0 0 0 1
1 0 0 1 1 1 1 1 1 0
0 0 1 0 1 0 0 0 0 0
1 1 1 1 0 1 0 1 0 1
0 0 0 0 1 1 0 1 0 1
0 1 0 1 0 1 1 1 1 0];
[r,c] = find(A);
groupsummary(c,r,@mean_diff)
ans = 10×1
4.0000 2.0000 1.5000 2.0000 2.5000 2.0000 1.0000 1.0000 1.0000 1.0000
function out = mean_diff(x)
m = diff(x)-1;
out = mean(m(m > 0));
end
  1 comentario
omidm
omidm el 9 de Dic. de 2022
This worked great, thank you. Indeed I did not want consecutive ones to have a value of zero between them. Thanks again!

Iniciar sesión para comentar.

Más respuestas (1)

Eric Delgado
Eric Delgado el 9 de Dic. de 2022
I don't know if my solution is the "simple way" that you request! :)
randomMatrix = randi([0,1],10)
randomMatrix = 10×10
0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0
meanZeros = zeros(height(randomMatrix), 1);
for ii = 1:height(randomMatrix)
meanZeros(ii) = mean(diff(find(randomMatrix(ii,:) == 1))-1);
end
meanZeros
meanZeros = 10×1
2.0000 1.3333 0.7500 1.0000 1.2500 0.3333 1.0000 0.5000 0.6667 0.4000
  1 comentario
Voss
Voss el 9 de Dic. de 2022
Note that this method treats consecutive 1's as containing zero 0's in between them, e.g., for the first row of A above, this method gives the average number of zeros as 2 = (4+0)/2 rather than 4 = 4/1.
It's not clear whether this is what OP intends.

Iniciar sesión para comentar.

Categorías

Más información sobre Logical en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by