How to find elements between zeros in matrix?

Hello, I have this matrix 3x3:
A = [3,4,6,0,2,7,10,5,0,1,0,8,9,0;
0,5,2,0,1,8,9,0,4,6,10,7,0,3;
1,0,7,2,0,4,10,8,0,3,5,0,6,9]
I want to find(specify) elements between zeros for each row, so I can apply some conditions on these elements between zeros. How can I do it with loops and also for large size matrices.

1 comentario

Jos (10584)
Jos (10584) el 20 de Dic. de 2017
  • Can there be more than 1 zeros between non-zero elements?
  • Are there always the same number of blocks of non-zero elements per row?
  • What does "apply some conditions" mean?
  • What should the output look like? Same size as A? What about the zeros in A?

Iniciar sesión para comentar.

 Respuesta aceptada

Image Analyst
Image Analyst el 20 de Dic. de 2017
Try this:
A = [3,4,6,0,2,7,10,5,0,1,0,8,9,0; 0,5,2,0,1,8,9,0,4,6,10,7,0,3; 1,0,7,2,0,4,10,8,0,3,5,0,6,9]
[rows, columns] = size(A);
for row = 1 : rows
% Extract just this one row from A.
thisRow = A(row, :);
% Get each group of non-zeros in this row.
props = regionprops(thisRow~=0, thisRow, 'PixelValues');
numGroups = length(props); % Get how many groups of non-zeros there are.
% Examine each group for meeting "constraints"
for g = 1 : numGroups
thisGroup = props(g).PixelValues
% Now do something with this group.
% Check constraints or whatever you want to do.
end
end

1 comentario

Hajem Daham
Hajem Daham el 21 de Dic. de 2017
Thanks Image Analyst, this what I am looking for. Now can you please help me to check this two constraints for each group of non-zeros as follow:
Assum that B =1:10 and the above matrix A which I used in my problem represents the random permutation for B after adding zeros. The elements in vector B are classified into these types: a = 1:3, b = 4:6, c = 7:10.
1- the first constraint is to ensure that each group of non-zero elements between zeros has no more than two elements of a,b,c. If this case exit there should be a penalty for the row which violates this constraint.
2- Assume that each element of B has a time and the maximum time for each group is 5, so the second constraint is to ensure that for each group the max time is not violated, otherwise there should be a penalty for this row.

Iniciar sesión para comentar.

Más respuestas (2)

Matt J
Matt J el 20 de Dic. de 2017
Do not use find(). There is no reason you need actual coordinates for what you describe, and it is just extra computation. Use logical indexing instead:
map=(A~=0);
for i=1:size(A,1)
A(i,map(i,:))=....
end

3 comentarios

Rik
Rik el 20 de Dic. de 2017
While it is of course better to use logical indexing whenever you can instead of find, there are some situations in which that is not possible. If you want to fit a curve to specific indices, it may be faster to just use explicit indices, instead of working with a logical matrix.
But yes: in general, use find only if you really can't use logical indexing.
Hajem Daham
Hajem Daham el 20 de Dic. de 2017
Hi Matt, it works, but what I want is to reach non-zeros elements without removing zeros, because the final result should contain zeros also.
Matt J
Matt J el 20 de Dic. de 2017
Hi Matt, it works, but what I want is to reach non-zeros elements without removing zeros, because the final result should contain zeros also.
Shouldn't matter...

Iniciar sesión para comentar.

Categorías

Más información sobre Creating and Concatenating Matrices en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 20 de Dic. de 2017

Comentada:

el 21 de Dic. de 2017

Community Treasure Hunt

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

Start Hunting!

Translated by