How to plot lines from a structure array faster?
25 次查看(过去 30 天)
显示 更早的评论
I have a structure array with a series of line segments with the following form:
S(1).Lat and S(1).Lon are both vector arrays of latitude and longitude points, respectively, with length N x 1
S(2).Lat and S(2).Lon are both vector arrays of latitude and longitude points, respectively, with length M x 1
and so on. In total there are 6279 separate line sem so the final line is stored in S(6279). Each Lat and Lon array is a different size so I cannot reshape to form a matrix.
Each line is defined by only about 14 coordinates, on average. So overall, I have less than 100000 points which need to be plotted. To me, this is not very many points and should be possible to plot very quickly. Some tests show that I don't understand how the plotting works:
Example #1: Execution time of 0.2 seconds. Random numbers from 0 to 1.
lat = rand(10^5,1);
lon = rand(10^5,1);
tic
worldmap('world');
plotm(lat,lon,'-k');
toc
Example #2: Execution time of 40 seconds. The only difference here is that random numbers are designed to cover the entire globe
lat = -90+180*rand(10^5,1);
lon = -180+(360+180)*rand(10^5,1);
tic
worldmap('world');
plotm(lat,lon,'-k');
toc
Example #3: Execution time of (forever). The difference here is that I've put the random numbers in a structure. Note that this is the fastest plotting method I've found online. I've let this run on my computer for >30 minutes and it still has not output anything.
%First, generate the random structure. (Completes in a fraction of a second)
S = [];
for i = 1:10000
nSeg = 10; %Note that here I am just setting the line segment length to 10 so that I
%get exactly 10^5 points to plot in total. In reality, nSeg
%is random integer centered on 14
S(i).Lat = -90+180*rand(nSeg,1);
S(i).Lon = -180+(360+180)*rand(nSeg,1);
end
%Time the plotting specifically:
tic
worldmap('world');
p = arrayfun(@(a) plotm(a.Lat,a.Lon,'-k'),S);
toc
Some questions:
(1) Why is Example #2 nearly 40 times slower than Example #1? Its the same number of points, just the location of the points change.
(2) Why is Example #3 so slow that it does not complete after >30 minutes (and still has not...)?
(3) Is there some way to speed up Example #3 to make this more useable? Currently, it is not feasible for me to plot this relatively small dataset!
Any help is much appreciated. Thanks!
2 个评论
Walter Roberson
2024-11-12,18:51
We do not know what N(i) is
Your code is timing the generation of random numbers, not just the plotting.
tic/toc cannot properly time plotting. tic/toc can time how long to dispatch the graphics into internal queues, but cannot time how long it takes to process the internal queues.
Could you confirm that you want a constant line color for all of the actual plotting you are doing?
回答(2 个)
Darcy Cordell
2024-11-12,18:46
1 个评论
Walter Roberson
2024-11-12,19:36
编辑:Walter Roberson
2024-11-12,19:43
Alternate formation without looping for adding the NaN.
for i = 10000:-1:1
S(i).Lat = -90+180*rand(10,1);
S(i).Lon = -180+(360+180)*rand(10,1);
end
tic
lat = cell2mat(reshape([{S.Lat}; num2cell(nan(1,size(S,2)))],[],1));
lon = cell2mat(reshape([{S.Lon}; num2cell(nan(1,size(S,2)))],[],1));
toc
tic
worldmap('world');
toc
tic
plotm(lat,lon,'-k');
toc
toc
Walter Roberson
2024-11-12,19:48
The difference in plotting times is due to the difference in range of coordinates. If you were to
plotm(lat/10, lon/10, '-k')
then the plotting would take less than 1 second. If you were to
plotm(lat/2, lon/2, '-k')
the plotting takes about 20 seconds.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 NaNs 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!