Find values of vector that fall within multiple ranges
8 views (last 30 days)
Show older comments
Anish Shah
on 6 Oct 2019
Commented: Walter Roberson
on 6 Oct 2019
Hello, I'm somewhat new to MATLAB, and impressed with how many features it has available. But I'm now stuck and couldn't find a code sample that worked/helped. I believe the answer is likely trivial, but having trouble putting it together.
Problem: I have a signal with a large number of peaks, however an number of them are just "noise". There are certain criteria for identifying these peaks, e.g. amplitude, threshold, etc.
% locations of all, indiscriminate peaks
locs(1:3) = [0.1740 2.7050 3.4340]
% Peaks amplitude/size at set locations
pks(1:3) = [3.5 4.2 8.9]
There is an additional criteria, that the peaks fall within certain ranges or windows of time. These selected windows are based on the value of another signal.
% These bounding vectors all fit within the time series of the peaks above
% May be a different number of "windows" than the peak location vector
lower_bounds(1:5) = [1.9930 2.8470 3.6940 4.5320 5.3670]
upper_bounds(1:5) = [2.6930 3.5470 4.3940 5.2320 6.0670]
Each peak is only considered to be True if it falls within these bounds. For this trivial example, only locs(3) falls within an acceptable range.
The actual vectors are of course much longer. I can't figure out how to do this in a practical sense. I'd like the output to be a new vector of locations that meet the windows criteria. I'd then like to use these new locations to identify which peaks are to be selected. This last step I imagine is likely a combination of vector indexing, which I can probalby figure out.
Any help would be appreciated. I've already tried for loops (but got lost in the vector storage and space allocation issues), as well as bounding the location vector between the two bounding vectors (however the sizes aren't the same, so there becomes an issue).
0 Comments
Accepted Answer
Walter Roberson
on 6 Oct 2019
loc_is_in_range = any(locs >= lower_bounds(:) & locs <= upper_bounds(:));
This depends upon locs being a row vector (not a column vector). This code should be usable from R2016b onwards; for earlier releases it would have to be modified.
2 Comments
Walter Roberson
on 6 Oct 2019
The above code uses a technique known as "implicit expansion". See https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b/
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!