Split and group data in Array

조회 수: 7 (최근 30일)
Luke
Luke 2019년 1월 3일
댓글: Cris LaPierre 2019년 1월 4일
Hello,
I have array of size 2200056*1 and it is plotted below.
I want to split the array based on different steps.
Goal: I want to find index in figure2 based on input signal array (figure1).
In this case, from input of multiple steps(figure 1), the output should be index numbers 1,2,3,4,7,9,10,11
If array consist only one step signal then i can find index easily by taking median(array). But if the array has multiple sequences then how can we achieve it? I think if i can split data in to groups then it would be possible but not sure how to split it?

채택된 답변

Cris LaPierre
Cris LaPierre 2019년 1월 3일
편집: Cris LaPierre 2019년 1월 3일
Here's one way if you want the values to be rounded to represent what is in your input speed array.
load speed.mat
% Round values to remove perturbations
p10 = floor(log10(speed));
% Set resolution
p10(p10<1)=1; % smallest increment is 10
p10(p10>3)=3; % largest increment is 1000
tmp = speed./10.^p10;
newSpeed = round(tmp).*10.^p10;
% find and remove transitions
idx = find(diff(newSpeed)>0);
idx([inf; diff(idx)]>5000) = [];
newSpeed(ismember(newSpeed,newSpeed(idx)))=[];
% remove tail
idx = find(diff(newSpeed)<0);
newSpeed(idx(1):end)=[];
steps = unique(newSpeed)
steps = 8×1
0
100
600
1000
4000
8000
10000
13000

추가 답변 (2개)

Cris LaPierre
Cris LaPierre 2019년 1월 3일
편집: Cris LaPierre 2019년 1월 3일
Use findgroups and splitapply functions.
Here is a simple example provided in the documentation
% Load table containing info for 100 patients
load patients
% Specify groups by gender with findgroups.
G = findgroups(Gender);
% Split Height into groups specified by G.
% Calculate the mean height by gender.
splitapply(@mean,Height,G)
ans = 2×1
65.1509
69.2340
  댓글 수: 3
Cris LaPierre
Cris LaPierre 2019년 1월 3일
편집: Cris LaPierre 2019년 1월 3일
Edit: moving your reply to a comment here:
Luke answered:
Thank you for quick response .
In my case, it wont work like this. Please have a look at attached .mat file and you will know why ?
If I want to group the data in my case then commnad findgroups would be needed more arguments that I cannot specify .
Cris LaPierre
Cris LaPierre 2019년 1월 3일
편집: Cris LaPierre 2019년 1월 3일
This approach will need some modification if your data is not just the step values (e.g. if it also contains values corresponding to the transition between each step). What to do in that scenario will depend on the actual data.
speek10k.png

댓글을 달려면 로그인하십시오.


Luke
Luke 2019년 1월 4일
I have come up with different logic as follow which gives same result.
load speed.mat
for i=1:1:length(speed)
speed_filt(i) =round(speed(i),-2);
end
speed_filt = speed_filt';
[n,bin] = hist(speed_filt,unique(speed_filt));
if isempty(n)
inStruct.ind = 0;
else
[~,idx] = sort(-n);
temp1 = n(idx); % count instances
temp1 = temp1';
temp2 = bin(idx); % corresponding values
for i=1:length(temp1)
if temp1(i)> 2000
inStruct.ind(i) = temp2(i);
end
end
end

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by