how to find the elements in a matrix that follow a certain pattern

Dear All,
I have been working on writing a code to get what I want and have not been luck yet. I hope you can help me to do so so that I can move on with my research. Any help will be appreciated.
I do have a column that has the following format in general:
[0;
0; % a number of zeros
.
.
5 %please note that the non-zero elements are essentially the row numbers i.e. the fifth element is 5 and so on.
6
7
8
0 % again a set of zeros
0
0
12
13
0
0]
what I want is to write a code that gives me the first and last element of each non-zero interval. for the example above my desired out put would be a matrix of 2*2 as
[5 8
12 13] % the first and second columns would be including the first and last non zero elements of each interval, respectively.
Thank you so much for your helps. I have been kind of stuck!

 Accepted Answer

This seems to work in the data you presented:
v = [0;
0;
0
5
6
7
8
0
0
0
12
13
0
0];
nzi = diff([0; v]);
nzigt0 = find(nzi > 1);
nzilt0 = find(nzi < 0);
Output = [v(nzigt0) v(nzilt0-1)]
Output =
5 8
12 13

4 Comments

Dear Star,
Thanks for the answer and I really appreciate it. It works perfectly with the problem I just posted; however, I think Walter's should be more comprehensive in a more general sense. I believe yours will fail if the non-zero elements won't be in a numeric order. But as said, when they are in the numeric order (like the example i provided in the question) it works perfectly.
My pleasure.
I have no idea what a more general problem may be. I have to assume that the problem you presented in your Question is representative of your actual problem.
I can’t see over the horizon!
yes and as I said, my friend your answer perfectly resolves my issue. Thanks for the time you devoted on helping me.

Sign in to comment.

More Answers (2)

v =[0
0
0
5
6
7
8
0
0
0
12
13
0
0];
z = [[0;v(1:end-1)],v];
out = z([0;diff(all(z,2))]==1,:);
mask = logical(YourVector(:));
run_start = strfind([false; mask], [0; 1]);
run_end = strfind([mask; false], [1; 0]);
desired_matrix = [run_start(:), run_end(:)];

3 Comments

Thank you Walter for the prompt answer but keep receiving this error:
Error using strfind Input strings must have one row.
run_start = strfind([false; mask], [0; 1])
mask = logical(YourVector(:)).';
run_start = strfind([false, mask], [0, 1]);
run_end = strfind([mask, false], [1, 0]);
desired_matrix = [run_start(:), run_end(:)];

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!