我使用的是Google地球工具箱,用于Octave,它与为MATLAB制作的库相同。有关该工具的MATLAB文档,请参阅this link。
不幸的是,我对某个功能遇到了一些麻烦:ge_quiver
。此函数创建一个箭头图并将结果转换为KML代码。我的问题
是因为我喜欢它有点太慢了。
对于30x30大小的数据变量,该功能大约需要10秒钟才能完成。这很好,除了我正在尝试制作动画箭袋图,其他23个相同大小的数据变量(总共24个)。由于Octave(以及MATLAB)通常只在一个线程上运行,所以整个过程是串行运行的,需要10 * 24 = 240 s。
我尝试了parfor
个循环,但它们只从总运行时间中删除了10秒。我有一台16核的电脑。考虑到,这是令人尴尬的平行(变量之间没有依赖关系),理想情况下应该采取:
前16个变量的10秒
8个剩余变量的+ 10秒
-------------------------------------------------- ----
=总共20秒。
我甚至没有测试过arrayfun,因为我不知道如何调整我的函数(p_ge_quiver
)。尽管如此,许多人都表示,arrayfun不会让它更快。
以下代码与我正在尝试的内容大致相同。记住变量
data_u
的大小为30x30x24。 data_v
,lon
和lat
也是如此。
...
...
[YYYY,MM,DD,HH,mm,ss] = ncdate(NCFILE);
date_s.year = YYYY;
date_s.month = MM;
date_s.day = DD;
date_s.hour = HH;
date_s.minute = mm;
date_s.second = ss;
TIMESTEP = 60;
parfor i = 1:size(data_u,3)
dt = TIMESTEP*i;
kml(i) = p_ge_quiver(lon,lat,data_u,data_v,dt,TIMESTEP,data_s);
endparfor
...
...
function kml = p_ge_quiver(lon,lat,u,v,data_time,step,date_s)
% V_GE_QUIVER - Writes the quiver plot into KML.
% Get date variables.
YYYY = date_s.year;
MM = date_s.month;
DD = date_s.day;
HH = date_s.hour;
mm = date_s.minute;
ss = date_s.second;
% Date format. Use Google's.
F = 'yyyy-mm-ddTHH:MM:SSZ';
% Start and end dates of data.
tStart = datestr(datenum(YYYY,MM,DD,HH,mm+data_time,ss),F);
tEnd = datestr(datenum(YYYY,MM,DD,HH,mm+data_time+step,ss),F);
% Quiver plot.
kml = ge_quiver(lon,lat,u,v,'timeSpanStart', tStart, ...
'timeSpanStop' , tEnd , ...
'visibility' , 0 , ...
'lineColor' , 'AAFFFFFF');
end
答案 0 :(得分:0)
我觉得问题出在ge_quiver
内部没有显示的内容上。除此之外,您应该注意到这种语言旨在编写矢量化代码(而且不仅仅是因为速度的不同)。
通过使用矢量化语法,查看代码,您可以简化它(这通常也会对速度产生影响):
step = 60;
dt = step:step:(step * size (data_u, 3));
## Get date variables.
YYYY = date_s.year;
MM = date_s.month;
DD = date_s.day;
HH = date_s.hour;
mm = date_s.minute;
ss = date_s.second;
## Date format. Use Google's.
F = "yyyy-mm-ddTHH:MM:SSZ";
tStart = datestr (datenum (YYYY, MM, DD, HH, mm + dt , ss), F);
tEnd = datestr (datenum (YYYY, MM, DD, HH, mm + dt + step, ss), F);
此时,tStart
和tEnd
包含您需要的所有日期,每行一次。唯一需要的循环如下:
for i=1:rows(tStart)
kml = ge_quiver (lon, lat, data_u, data_v, "timeSpanStart", tStart(i,:), ...
"timeSpanStop" , tEnd(i,:) , ...
"visibility" , 0 , ...
"lineColor" , "AAFFFFFF");
endfor
此时完全取决于ge_quiver
的作用。您链接的mathworks网站显示为维护中。我查看the Google Earth toolbox website并找不到该功能(虽然他们有ge_quiver3
功能。)
我认为这种语言的函数应该允许向量输入,所以去确认它。也许你根本不需要循环。