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

3 visualizzazioni (ultimi 30 giorni)
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!

Risposta accettata

Star Strider
Star Strider il 25 Giu 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 Commenti
Homayoon
Homayoon il 25 Giu 2016
yes and as I said, my friend your answer perfectly resolves my issue. Thanks for the time you devoted on helping me.

Accedi per commentare.

Più risposte (2)

Andrei Bobrov
Andrei Bobrov il 25 Giu 2016
Modificato: Andrei Bobrov il 25 Giu 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 il 25 Giu 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 Commenti
Homayoon
Homayoon il 25 Giu 2016
Error using strfind Input strings must have one row.
run_start = strfind([false; mask], [0; 1])
Walter Roberson
Walter Roberson il 25 Giu 2016
mask = logical(YourVector(:)).';
run_start = strfind([false, mask], [0, 1]);
run_end = strfind([mask, false], [1, 0]);
desired_matrix = [run_start(:), run_end(:)];

Accedi per commentare.

Categorie

Scopri di più su Resizing and Reshaping Matrices in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by