Find indices of elements for given difference
古いコメントを表示
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);
採用された回答
その他の回答 (3 件)
Bruno Luong
2020 年 7 月 19 日
編集済み: Bruno Luong
2020 年 7 月 19 日
i = interp1(t, 1:length(t), 0:10:max(t), 'nearest', 'extrap');
9 件のコメント
madhan ravi
2020 年 7 月 19 日
It’s wrong. This gives index one as well.
Bruno Luong
2020 年 7 月 19 日
編集済み: Bruno Luong
2020 年 7 月 19 日
So why 1 is wrong? (assuming t starts from 0 as stated by OP)
madhan ravi
2020 年 7 月 19 日
“I want to find indices every ~10 ms”
Bruno Luong
2020 年 7 月 19 日
編集済み: Bruno Luong
2020 年 7 月 19 日
Every ~10 ms meaning (in english) is that the difference between 2 consecutive samples is about 10 ms, NOT necessary it must start at 10 ms.
madhan ravi
2020 年 7 月 19 日
編集済み: madhan ravi
2020 年 7 月 19 日
Thank you for the “English lessons” ;) I wonder why the OP didn’t include it in the expected result then xD.
Bruno Luong
2020 年 7 月 19 日
編集済み: Bruno Luong
2020 年 7 月 19 日
We do not need OP to confirm whereas t=0 must be considered, since
>> why(0)
Barney wanted it that way.
Who are we to argue with Barney? Clear now?
madhan ravi
2020 年 7 月 19 日
Who’s Barney? A God xD?
Bruno Luong
2020 年 7 月 19 日
Here is the evidence
>> sum('Barney:')==sum('the god')
ans =
logical
1
madhan ravi
2020 年 7 月 19 日
😂 , a good sense of humour after all.
dpb
2020 年 7 月 19 日
0 投票
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 件のコメント
dpb
2020 年 7 月 19 日
Possibly simply because 0 being first element wasn't hard to find... :)
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.
カテゴリ
ヘルプ センター および File Exchange で MATLAB についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!