Assigning values to the array of Enumeration Class seems to be very slow

14 次查看(过去 30 天)
Hi, I met this problem when parsing a gps log.
I made an Enumeration Class GpsState as follows.
classdef GpsState
enumeration
Lost
Single
RTD
RTK_Float
RTK_Fix
end
end
Then I created an array of GpsState to record all the states of the log. The process was painfully slow.
Finally, I found out what the problem was caused by the assign of Enumeration Class array.
I simplified the code as follows, the process takes about 4.6s.
tic
test_num = 1e5;
gps_state = repmat(GpsState.Lost,test_num,1);
for ii = 1:test_num
gps_state(ii) = GpsState.RTK_Fix;
end
toc
Is there any problem with my usage mode of Enumeration Class?
Thanks for your reading.

回答(1 个)

Steven Lord
Steven Lord 2020-1-20
Why are you initializing all the elements in gps_state to GpsState.Lost in one call them immediately overwriting them with GpsState.RTK_Fix?
If you oversimplified your problem, and you wanted say) to only overwrite certain elements of gps_state, there's no need for a for loop here. Just overwrite them in one fell swoop, something like this untested code.
test_num = 1e5;
gps_state = repmat(GpsState.Lost, test_num, 1);
OneThousandRandomPoints = randperm(test_num, 1000);
gps_state(OneThousandRandomPoints) = GpsState.RTK_Fix; % scalar expansion
  1 个评论
pingping zhang
pingping zhang 2020-1-20
Hey, there is some misunderstanding,that is my issue.
In actual fact, the original code contains a process of parsing and judging gps status.
I read gps status words from the log line by line, and assign gps_state values one by one.
It's something like this.
for ii = 1:test_num
....
switch gps_status_word(ii)
case "00"
gps_state(ii) = GpsState.Lost;
case "04"
gps_state(ii) = GpsState.RTK_Fix;
...
end
end
I found the process was particularly slow, and the root cause is the the assign of Enumeration Class array.
If I replace the Enumeration of GpsState by another tye like int8, for exmaple, 'gps_state(ii) = 0' , it will be much faster.
In order to describe the problem more simply, I use the code above. It shows us the elapsed time spent when assigning values to the array of Enumeration Class directly.
Now I can temporarily use int8 instead, but still want to make sure how to use Enumeration Class effectively.
Thanks for your advice.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Enumerations 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by