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

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일

0 개 추천

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

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일

0 개 추천

i = interp1(t, 1:length(t), 0:10:max(t), 'nearest', 'extrap');

댓글 수: 9

It’s wrong. This gives index one as well.
Bruno Luong
Bruno Luong 2020년 7월 19일
편집: Bruno Luong 2020년 7월 19일
So why 1 is wrong? (assuming t starts from 0 as stated by OP)
“I want to find indices every ~10 ms”
Bruno Luong
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
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
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?
Who’s Barney? A God xD?
Here is the evidence
>> sum('Barney:')==sum('the god')
ans =
logical
1
😂 , a good sense of humour after all.

댓글을 달려면 로그인하십시오.

dpb
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
  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일

0 개 추천

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

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에 대해 자세히 알아보기

제품

질문:

2020년 7월 19일

댓글:

2020년 7월 19일

Community Treasure Hunt

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

Start Hunting!

Translated by