How to find elements between zeros in matrix?

2 vues (au cours des 30 derniers jours)
Hajem Daham
Hajem Daham le 20 Déc 2017
Commenté : Hajem Daham le 21 Déc 2017
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 commentaire
Jos (10584)
Jos (10584) le 20 Déc 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?

Connectez-vous pour commenter.

Réponse acceptée

Image Analyst
Image Analyst le 20 Déc 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 commentaire
Hajem Daham
Hajem Daham le 21 Déc 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.

Connectez-vous pour commenter.

Plus de réponses (2)

Matt J
Matt J le 20 Déc 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 commentaires
Hajem Daham
Hajem Daham le 20 Déc 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 le 20 Déc 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...

Connectez-vous pour commenter.


Rik
Rik le 20 Déc 2017
Use find.
ind=find(A);
[r,c]=find(A);

Catégories

En savoir plus sur Creating and Concatenating Matrices dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by