Find indices of elements for given difference
11 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Jayant chouragade
le 19 Juil 2020
Commenté : madhan ravi
le 19 Juil 2020
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 commentaire
SilverSurfer
le 19 Juil 2020
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);
Réponse acceptée
madhan ravi
le 19 Juil 2020
Modifié(e) : madhan ravi
le 19 Juil 2020
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 commentaire
madhan ravi
le 19 Juil 2020
Use
Dt = bsxfun(@minus, t, (10:10max(t)).') % if you’re using version prior to 2016b
Plus de réponses (3)
Bruno Luong
le 19 Juil 2020
Modifié(e) : Bruno Luong
le 19 Juil 2020
i = interp1(t, 1:length(t), 0:10:max(t), 'nearest', 'extrap');
9 commentaires
Bruno Luong
le 19 Juil 2020
Here is the evidence
>> sum('Barney:')==sum('the god')
ans =
logical
1
dpb
le 19 Juil 2020
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 commentaire
Image Analyst
le 19 Juil 2020
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 commentaire
Bruno Luong
le 19 Juil 2020
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.
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!