Indexing to return segments
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Frank Pernett
el 29 de En. de 2021
Comentada: Frank Pernett
el 9 de Mzo. de 2021
Hi. I know this could look like a silly question but can't find a way to do it. I have a matrix (data) that is 14258 x 7, the first six columns are data from a subject and the last column are time markers (0 off and 5 is on).
I used ischange on the last column to have the changing points:
[index,~] = ischange(data(:,7))
The problem is that I should end with 10 segments (of different duration) that include the data of the other 6 columns, but I don't know how to use the index to have it.
Thanks in advance
0 comentarios
Respuesta aceptada
Image Analyst
el 29 de En. de 2021
This will take the 10 different regions of 5, and 11 different regions of 0 and put them into cell arrays output5 and output0. I need to use cell arrays because not every run has the same number of rows in it.
The code requires the Image Processing Toolbox.
s = load('data.mat')
data = s.data;
% Get the segments with 5 in the last column.
is5 = data(:, end) == 5;
props = regionprops(is5, 'Area', 'PixelList');
allRunLengths = [props.Area] % Just for our information - not used at all.
% Take these 10 runs of lengths 266 352 347 384 383 454 505 536 549 604
% and put them into a cell array
for k = 1 : numel(props)
rows = props(k).PixelList(:, 2);
output5{k} = data(rows, 1:6);
end
% Get the segments with 0 in the last column.
is0 = data(:, end) == 0;
props = regionprops(is0, 'Area', 'PixelList');
allRunLengths = [props.Area] % Just for our information - not used at all.
% Take these 11 runs of lengths 1526 618 611 627 608 1957 601 603 604 613 1510
% and put them into a cell array
for k = 1 : numel(props)
rows = props(k).PixelList(:, 2);
output0{k} = data(rows, 1:6);
end
Más respuestas (1)
Bob Thompson
el 29 de En. de 2021
It looks like the index output is actually a logic array. I recommend using find to identify the actual indexes of the identified changes. I imagine it woud look something like the following, but it is untested:
[index] = find(ischange(data(:,7))==1);
I'm not quite sure how you want to utilize the different sections, but you could capture the different time elements in a cell array kind of like the following:
timedata{1} = data(1:index(1)-1,1:6);
for i = 1:length(index)-1
timedata{i+1} = data(index(i):index(i-1),1:6);
end
timedata{length(index)+1} = data(index(end):end,1:6);
Ver también
Categorías
Más información sobre Matrices and Arrays en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!