How to find elements between zeros in matrix?

2 views (last 30 days)
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 Comment
Jos (10584)
Jos (10584) on 20 Dec 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?

Sign in to comment.

Accepted Answer

Image Analyst
Image Analyst on 20 Dec 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 Comment
Hajem Daham
Hajem Daham on 21 Dec 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.

Sign in to comment.

More Answers (2)

Matt J
Matt J on 20 Dec 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 Comments
Hajem Daham
Hajem Daham on 20 Dec 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 on 20 Dec 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...

Sign in to comment.


Rik
Rik on 20 Dec 2017
Use find.
ind=find(A);
[r,c]=find(A);

Categories

Find more on Creating and Concatenating Matrices 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!