0


Octave 用の Google Earth ツールボックスを使用しています。これは、MATLAB 用に作成された同じライブラリと非常によく似ています。ツールの MATLAB ドキュメントについては、このリンクを参照してください。

残念ながら、特定の機能に少し問題があります: ge_quiver. この関数は、quiver プロットを作成し、結果を KML コードに変換します。私の問題は、私の好みには少し遅すぎることです。

サイズが 30x30 のデータ変数の場合、関数が完了するまでに約 10 秒かかります。23 個の同じサイズのデータ​​変数 (合計 24 個) を使用して、アニメーションの震えプロットを作成しようとしているという事実を除いて、これは問題ありません。通常、Octave (および MATLAB) は 1 つのスレッドでのみ実行されるため、すべてがシリアルに実行され、10*24 = 240 秒かかります。

ループを試してみparforましたが、総実行時間から 10 秒しか減りませんでした。16 コアのコンピューターを使用しています。これは恥ずかしいほど並列である(変数間に依存関係がない)ことを考えると、理想的には次のようにする必要があります。

最初の 16 個の変数に
10 秒 + 残りの 8 個の変数に 10 秒
----------------------------------- -------------------
= 合計 20 秒。

関数を適応させる方法がわからないため、arrayfun もテストしていません ( p_ge_quiver)。それにもかかわらず、多くの人は、arrayfun を使用しても速度が向上しないと言っています。

次のコードは、おおよそ私がやろうとしていることです。変数 data_uのサイズは 30x30x24 であることに注意してください。data_vlonおよびについても同じです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
4

1 に答える 1

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);

この時点で、tStart1tEnd行に 1 回、必要なすべての日付が表示されます。唯一必要なループは次のとおりです。

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 サイトはメンテナンス中のようです。Google Earth ツールボックスの Web サイトを調べたところ、その機能が見つかりませんでした (ge_quiver3機能はありますが)。

このタイプの言語の関数はベクトル入力を許可する必要があると私は主張するので、行って確認してください。たぶん、ループはまったく必要ありません。

于 2013-08-17T19:47:53.533 に答える