Using ismember to get the corresponding elements

조회 수: 1 (최근 30일)
Hari krishnan
Hari krishnan 2018년 11월 13일
댓글: Guillaume 2018년 11월 18일
Hi, I am using a function to convert the time to seconds based on specific input. 'time_data_observation_entry,real_time_vec,frame_vec are column vetors and frame_rate_played_video = 8. time_data_observation_entry have two columns. After performing the 'ismember' operation, i am not able to preserve the real_time corresponding to time_data_observation_entry. It looses the structure of the data. Any help to solve this will be appreciated
time_data_observation = load('time_data_observation.mat')
frame_rate_played_video = 8;
real_time_vec = load('real_time_vec');
frame_vec = load('frame_vec');
function [real_time] = time_from_videos_to_second_convertor(time_data_observation_entry,frame_rate_played_video,real_time_vec,frame_vec)
for ii = 1:length(time_data_observation_entry)
if isnan(time_data_observation_entry)
continue
end
frame_id = floor(time_data_observation_entry*frame_rate_played_video);
real_time = real_time_vec(ismember(frame_vec,frame_id));
end
end
  댓글 수: 3
Hari krishnan
Hari krishnan 2018년 11월 13일
Hi, I am selecting the corresponding elements from the real_time_vec, wherever the elements in the frame_vec contains the elements in frame_id. As you said the time_data_observation has two columns, i want real_time vector to be also two columns corresponding to the operation function is performing.
Currently i have two columns in time_data_observation with 24 rows in each column. Whenever i run the function, i get the real_time vector with a single column of 48 rows and all elements are just arranged in ascending order rather than keeping the structure.
Sample data is attached
Hari krishnan
Hari krishnan 2018년 11월 14일
Can someone give an idea.

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

채택된 답변

Nick
Nick 2018년 11월 14일
편집: Nick 2018년 11월 14일
Like Guillaume already mentioned you did not perform any indexing inside your loop and are just repeating the entire operation every time. What i assumed you wanted to do is:
function [real_time] = time_from_videos_to_second_convertor(time_data_observation_entry,frame_rate_played_video,real_time_vec,frame_vec)
real_time = nan(size(time_data_observation_entry));
for ii = 1:length(time_data_observation_entry)
if any(isnan(time_data_observation_entry)) % or all instead of any if you only wanna skip if both entries are nan
continue
end
frame_id = floor(time_data_observation_entry(ii,:)*frame_rate_played_video);
real_time(ii,:) = real_time_vec(ismember(frame_vec,frame_id));
end
end
This will return a real_time vector, with the same format as time_data_observation but nans where they the time_data_observations are nans, you can filter them out of the result or inside the function using logical indexing.
  댓글 수: 1
Guillaume
Guillaume 2018년 11월 18일
Never use length on a matrix. In this particular, length means size(time_data_observation_entry, 1). Depending on the height of that matrix, it could return size(time_data_observation_entry, 2).
I've not tried to understand the code fully in that answer. As far as I can tell, it's a slower and more complicated way of obtaining the same result as mine. Notice that my answer doesn't have any loop and only one call to ismember.

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

추가 답변 (1개)

Guillaume
Guillaume 2018년 11월 14일
I think I understand what you want, if so, you're using ismember the 'wrong way round':
function real_time = time_from_videos_to_second_convertor(time_data_observation_entry, frame_rate_played_video, real_time_vec,frame_vec)
frame_id = floor(time_data_observation_entry * frame_rate_played_video);
[found, where] = ismember(frame_id, frame_vec);
assert(all(found(:)), 'Some frames were not found in frame_vec');
real_time = real_time_vec(where);
end
Note that I made the above function error if a frame is not found in frame_vec. Otherwise, I'm not sure what you'd want to do. You could set the corresponding entry to NaN or remove the entire row. It's trivial to do either.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by