Find indices of elements for given difference

10 ビュー (過去 30 日間)
Jayant chouragade
Jayant chouragade 2020 年 7 月 19 日
コメント済み: madhan ravi 2020 年 7 月 19 日
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
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
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
madhan ravi 2020 年 7 月 19 日
Use
Dt = bsxfun(@minus, t, (10:10max(t)).') % if you’re using version prior to 2016b

サインインしてコメントする。

その他の回答 (3 件)

Bruno Luong
Bruno Luong 2020 年 7 月 19 日
編集済み: Bruno Luong 2020 年 7 月 19 日
i = interp1(t, 1:length(t), 0:10:max(t), 'nearest', 'extrap');
  9 件のコメント
Bruno Luong
Bruno Luong 2020 年 7 月 19 日
Here is the evidence
>> sum('Barney:')==sum('the god')
ans =
logical
1
madhan ravi
madhan ravi 2020 年 7 月 19 日
😂 , a good sense of humour after all.

サインインしてコメントする。


dpb
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
  1. ismembertol to find within some defined tolerance about the target, or
  2. 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 件のコメント
dpb
dpb 2020 年 7 月 19 日
Possibly simply because 0 being first element wasn't hard to find... :)

サインインしてコメントする。


Image Analyst
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
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.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

製品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by