MATLAB Answers


Using ismember to get the corresponding elements

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)
frame_id = floor(time_data_observation_entry*frame_rate_played_video);
real_time = real_time_vec(ismember(frame_vec,frame_id));

  3 件のコメント

2018 年 11 月 13 日
Notice you don't use ii anywhere inside your loop. As a result, all your loop does is redo the exact same calculation, producing the exact same results multiple times. Also, since you're not iterating over the elements of time_data_observation_entry, your if isnan(xx) will only be true if all the elements of time_data_observation_entry are NaN.
I'm not really clear on what you're trying to do. Since time_data_observation_entry is a two column matrix, so will be frame_id. Then you're asking which elements of the vector frame_vec is found anywhere within the matrix and you're getting a vector the same shape as frame_id back, and select the corresponding elements of real_time_vec. Apart from the fact that you're using both columns of time_data_observation_entry it all makes sense, but if that's not what you want, what do you want?
A small example with actual numbers would help.
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 2018 年 11 月 14 日
Can someone give an idea.

サインイン to comment.

2 件の回答

回答者: 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
frame_id = floor(time_data_observation_entry(ii,:)*frame_rate_played_video);
real_time(ii,:) = real_time_vec(ismember(frame_vec,frame_id));
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 件のコメント

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.

サインイン to comment.

回答者: 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);
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.

  0 件のコメント

サインイン to comment.

Translated by