Find indices of elements for given difference
12 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Jayant chouragade
el 19 de Jul. de 2020
Comentada: madhan ravi
el 19 de Jul. de 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 comentario
SilverSurfer
el 19 de Jul. de 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);
Respuesta aceptada
madhan ravi
el 19 de Jul. de 2020
Editada: madhan ravi
el 19 de Jul. de 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 comentario
madhan ravi
el 19 de Jul. de 2020
Use
Dt = bsxfun(@minus, t, (10:10max(t)).') % if you’re using version prior to 2016b
Más respuestas (3)
Bruno Luong
el 19 de Jul. de 2020
Editada: Bruno Luong
el 19 de Jul. de 2020
i = interp1(t, 1:length(t), 0:10:max(t), 'nearest', 'extrap');
9 comentarios
Bruno Luong
el 19 de Jul. de 2020
Here is the evidence
>> sum('Barney:')==sum('the god')
ans =
logical
1
dpb
el 19 de Jul. de 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 comentario
Image Analyst
el 19 de Jul. de 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 comentario
Bruno Luong
el 19 de Jul. de 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.
Ver también
Categorías
Más información sobre Matrix Indexing en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!