# loop indexing length of non zeroes

1 view (last 30 days)
Morten Jørgensen on 2 Jun 2019
Edited: Adam Danz on 10 Jun 2019
Hi, I'm trying to make a loop that finds the length of a sequence of numbers:
I want to find when x(:,4) is not equal to zero, and then find how long it's is the same number, I want to save the number and the start row, and the end row.
my output should look something like this:
Id start end length
10 1320 1331 11
9 1352 1354 3
thanks for any help
Adam Danz on 5 Jun 2019
Have you tried the answer I proposed below? It ignores 0s as you described.

Adam Danz on 3 Jun 2019
Edited: Adam Danz on 4 Jun 2019
Here are the steps needed to build your table.
% Create fake data that looks like your example
x = rand(2000,5);
x(:,4) = 0;
x(1320:1331,4) = 10;
x(1352:1354,4) = 9;
% calculate table components
isZero = x(:,4)==0;
dz = [0;diff(isZero)];
start = find(dz == -1); %start column
endIdx = find(dz == 1)-1; %end column
ID = x(start,4); %ID column
len = endIdx - start; %Length column
% Create table
T = table(ID,start,endIdx,len,'VariableNames', {'Id','start','endIdx','length'});
Result
T =
2×4 table
Id start endIdx length
__ _____ ______ ______
10 1320 1331 11
9 1352 1354 2
* Note that 'end' is not a valid variable name nor a valid table column name.

Steven Lord on 3 Jun 2019
You can use the ischange function to identify abrupt changes in your data (the jump from 0 to 10 and the drop from 10 back down to 0.)