Replacing small sections of a logical vector
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
I'm working with EMG data to determine when muscles activate in a group of disabled people.
After data processing I end up with a logical vector, of 1s where the muscle in 'on', and 0s where the muscle is 'off', for example:
EMG = 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Periods of three 1s or less in a row are likely to be artefact, and I need to replace them with 0s. E.g. to make the above into:
EMG = 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Any help is greatly appreciated!
0 comentarios
Respuestas (4)
Image Analyst
el 25 de Nov. de 2016
It's a one-liner if you have the Image Processing Toolbox since there is a function made specially to do that operation:
EMG = bwareaopen(EMG, 4); % Keep runs of 1's that are 4 or longer.
0 comentarios
Alexandra Harkai
el 25 de Nov. de 2016
There are a few different ways to do it.
This method may be frowned upon, but it nonetheless produces the required output:
n = 3; % max length of artefact periods
s = char(EMG+65); % converting 0-1 data to A-B string
for j=1:n
% get rid of periods of length j
s = strrep(s, ['A', repmat('B',1,n), 'A'], [repmat('A',1,n+2)]);
end
res = double(s)-65; % converting back to logical values
0 comentarios
Andrei Bobrov
el 25 de Nov. de 2016
Editada: Andrei Bobrov
el 25 de Nov. de 2016
v = bwlabel(EMG);
EMG(ismember(v,find(accumarray(v(:)+1,1)<=3)-1)) = 0;
0 comentarios
Jan
el 25 de Nov. de 2016
[B, N] = RunLength(EMG);
B(N <= 3) = 0;
EMG2 = RunLength(B, N);
0 comentarios
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!