Find indices of elements for given difference
12 ビュー (過去 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');
9 件のコメント
Bruno Luong
2020 年 7 月 19 日
Here is the evidence
>> sum('Barney:')==sum('the god')
ans =
logical
1
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.
参考
カテゴリ
Help Center および File Exchange で Matrix Indexing についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!