Separating a vector based on its value

2 visualizzazioni (ultimi 30 giorni)
I currently have a vector of angle data (0-360). I am trying to create a loop that will create a new vector each time a value lower than 3 occurs as my data, as it has more than on 'cycles' in it. The code I use currently is very clunky, and I am sure there is a more simple loop that could do this:
x = find(diff(CA>352));
xx = x(2:2:end);
CA1 = CA(1:(xx(1)));
CA2 = CA((xx(1)+1):(xx(2)));
CA3 = CA((xx(2)+1):(xx(3)));
CA4 = CA((xx(3)+1):(xx(4)));
CA5 = CA((xx(4)+1):(xx(5)));
Any advise or solution would be great!
  3 Commenti
Jessica Smith
Jessica Smith il 29 Apr 2016
I used this as the recorded angle didn't always hit '0' or '360', therefore, using this number seemed to identify a big enough change in angle to know a new cycle had begun. Again, admittedly very clunky
Image Analyst
Image Analyst il 29 Apr 2016
What I did in my answer was to "create a new vector each time a value lower than 3 occurs" - did you see it. I also have no idea why 352 was used, so I used 3 like you said in the quote I just gave.

Accedi per commentare.

Risposta accettata

Azzi Abdelmalek
Azzi Abdelmalek il 29 Apr 2016
Modificato: Azzi Abdelmalek il 29 Apr 2016
v=randi([0 360],1,1000)
threshold=3
out=accumarray((cumsum(v<=threshold)+1*~(v(1)<=threshold))',1:numel(v),[],@(x) {v(x)})

Più risposte (1)

Image Analyst
Image Analyst il 29 Apr 2016
Modificato: Image Analyst il 29 Apr 2016
If you have the Image Processing Toolbox, you can do it (find all contiguous runs of data less than value of 3) all in just 2 lines of code.
% Create random data
data = 10 * rand(1,100)
% Now, here is the main code.
% Find places where data is less than 3
lessThan3 = data < 3;
% Get coordinates of those into new vectors.
% Each "run" of data less than 3 is in a vector called PixelValues
% that is a field of a structure array called measurements
measurements = regionprops(lessThan3, data, 'PixelValues');
% NOW WE'RE ALL DONE!
% For fun, type out all those vectors
for k = 1 : length(measurements)
fprintf('For run #%d, there are %d elements : ', k, length(measurements(k).PixelValues));
fprintf('%.3f ', measurements(k).PixelValues);
fprintf('\n');
end
Here's the data it found:
For run #1, there are 1 elements : 1.898
For run #2, there are 4 elements : 2.414 1.204 2.450 2.037
For run #3, there are 1 elements : 2.415
For run #4, there are 1 elements : 1.535
For run #5, there are 3 elements : 1.942 2.866 0.586
For run #6, there are 1 elements : 2.383
For run #7, there are 1 elements : 1.805
For run #8, there are 2 elements : 1.465 1.349
For run #9, there are 1 elements : 2.462
For run #10, there are 1 elements : 1.067
For run #11, there are 2 elements : 1.888 2.140
For run #12, there are 1 elements : 0.324
For run #13, there are 2 elements : 2.392 1.706
For run #14, there are 2 elements : 0.594 1.408
For run #15, there are 1 elements : 0.563
For run #16, there are 1 elements : 2.259
For run #17, there are 3 elements : 1.324 1.736 2.766
For run #18, there are 1 elements : 0.917
For run #19, there are 1 elements : 1.377
For run #20, there are 1 elements : 2.709
For run #21, there are 1 elements : 1.516
You can even do it all in one line of code if you want:
measurements = regionprops(data<3, data, 'PixelValues');

Categorie

Scopri di più su Image Processing and Computer Vision 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