MATLAB Answers

0

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)
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 件のコメント

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

  0 件のコメント

サインイン to comment.



Translated by