Find indices of elements for given difference
7 次查看(过去 30 天)
显示 更早的评论
Hi,
I have an incrementing time vector from 0 to 500 ms . Increment in time is not constant. I want to find indices every ~10 ms . E.g
t=[0, 1 ,3,4,7,10,13,15,16,19,20, 23,25,27,31...........500ms];
Then I would like to find indices of 10,20,31 ...., that will be 6th, 11th,15th.
Is this possible without loop.
thanks
jayant
1 个评论
SilverSurfer
2020-7-19
If you know in advance which numbers you need to identify you can use find function.
Here there is a suggestion for finding multiple elements.
t=[0,1,3,4,7,10,13,15,16,19,20,23,25,27,31];
num = [10,20,31];
c = ismember(t,num);
indexes = find(c);
采纳的回答
madhan ravi
2020-7-19
编辑:madhan ravi
2020-7-19
Nearest element after or equal to the boundary:
Dt = t - (10:10:max(t)).';
Dt(Dt<0) = inf;
[~, Indices] = min(Dt,[],2)
Wanted = t(Indices)
Nearest elements before or equal it crosses boundary:
Dt = t - (10:10:max(t)).';
Dt(Dt>0) = -inf;
[~, Indices] = max(Dt,[],2)
Wanted = t(Indices)
1 个评论
madhan ravi
2020-7-19
Use
Dt = bsxfun(@minus, t, (10:10max(t)).') % if you’re using version prior to 2016b
更多回答(3 个)
Bruno Luong
2020-7-19
编辑:Bruno Luong
2020-7-19
i = interp1(t, 1:length(t), 0:10:max(t), 'nearest', 'extrap');
dpb
2020-7-19
find and/or ismember will only return EXACT matches -- will NOT return something "on or about" a 10 ms interval.
Two possibilities come to mind
- ismembertol to find within some defined tolerance about the target, or
- interp1 with 'nearest' option
The second will return something for every input in range; the first may not find something if the spacing is such there isn't one within the given tolerance--or could potentially return more than one if the tolerance is too large.
1 个评论
Image Analyst
2020-7-19
Here's one way to record the index and time of when the times first cross "10" boundaries:
t = sort(randperm(500, 200)) % Sample data
times = [0,0];
counter = 1;
for k = 0 : 10 : max(t)
index = find(t >= k, 1, 'first'); % Find where it crosses multiple of 10 for the first time.
if ~isempty(index)
times(counter, 1) = index; % Log index
times(counter, 2) = t(index); % Log the actual time.
counter = counter + 1;
end
end
times % Show in command window.
1 个评论
Bruno Luong
2020-7-19
The same can be achieved without for-loop by using INTERP1 with 'NEXT' method in recent MATLAB realeases (just change 'nearest' in my anser to 'next'), or a combo of HISTC/ACCUMARRAY on older MATLAB.
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!