Clear Filters
Clear Filters

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

2 views (last 30 days)
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

Star Strider
Star Strider on 25 Jun 2016
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
Homayoon
Homayoon on 25 Jun 2016
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)

Andrei Bobrov
Andrei Bobrov on 25 Jun 2016
Edited: Andrei Bobrov on 25 Jun 2016
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,:);

Walter Roberson
Walter Roberson on 25 Jun 2016
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
Homayoon
Homayoon on 25 Jun 2016
Error using strfind Input strings must have one row.
run_start = strfind([false; mask], [0; 1])
Walter Roberson
Walter Roberson on 25 Jun 2016
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!