5

重複の可能性:
MATLAB でのグローバル変数の宣言

現在、私の matlab コードは、内部関数のない 1 つの大きなスクリプト ファイルになっています。コードを読みやすくしたり、コードを再利用したりするために、スクリプト内で関数を宣言したいと考えています。これ自体は、matlab では難しくありません。

例 1:

function main()
  myfunc('goat');
end

function myfunc(x)
  fprintf(x);
end

私の問題は、データの再ロードに時間を費やすことなく開発中にコードを再実行できるように、一度だけロードしたい大きなデータファイルがあることです。これは、内部関数のない 1 つの大きなスクリプトを使用する現在のフレームワークでは問題になりません。1 つの解決策は、2 つの matlab スクリプト ファイルを用意することです。1 つはデータをロードし、別のスクリプトで関数を呼び出すためのものです。

ただし、上記の例 1 では、真のグローバル変数宣言は機能せず、スクリプトを実行するたびに biig ファイルを強制的にロードする必要があります。私がやりたいことは、2つの例で示すことができます:

例 2:

% Global variable
if ~exist('data',var) 
  data = load biigdatafile.mat;  %FAILS, outside function.
end

function main()
  myfunc('goat');
end

function myfunc(x)
  fprintf(x);
end

例 3:

function main()
  % Global variable
  if ~exist('data',var)
    global data;     % Is not really global after whole script is completed.
    data = load biigdatafile.mat;
  end
  myfunc('goat');
end

function myfunc(x)
  fprintf(x);
end

だから私の質問は、例 2 のように真のグローバル変数を宣言する方法です。ここでは、1 つのスクリプト内で関数を呼び出しながら、ワークスペースにとどまるためにデータを 1 回ロードしますか?

4

3 に答える 3

2

入力引数を使用します。それが目的です

メイン関数に引数を使用し、データセットを一度ベース ワークスペースに読み込み、そのデータセットを引数として関数を呼び出すことができます。サブ関数もデータセットを使用する場合は、それを渡します

function main(data)
    if nargin<1
        disp('hey, you forgot to supply the dataset!');
    end
    % do your stuff
    showData(data);
end

次に、ベース ワークスペースで:

Data = load('biigdatafile.mat');
main(Data);

永続変数を使用する

persistent X Y ZXY、およびZを、それらが宣言されている関数に対してローカルな変数として定義します。ただし、それらの値は関数の呼び出し間でメモリに保持されます。永続変数は、MATLAB ソフトウェアが両方の永続ストレージを作成するため、グローバル変数に似ています。永続変数は、それらが宣言されている関数にのみ認識されるという点で、グローバル変数とは異なります。

したがって、次のように簡単に使用できます。

function main()
    persistent data;
    if isempty(data)
        disp('loading dataset');
        data=load('biigdatafile.mat');
    end
    % do your stuff
    showData(data);
end

クリアされたベース ワークスペースまたはクリアされた関数*でこの関数を初めて呼び出すと、データセットが読み込まれます。次回 (関数が編集されていないとき)、データセットは既に/まだメモリ内にあります。

私は通常、1 つのデータセットのみを使用するときにこれを行います。常にデータセットをロードするのは面倒ですし、関数をテストするときは F5 を押す方が簡単です。



* 機能がクリアされるのはいつですか?

メモリ内の関数をクリアまたは変更すると、MATLAB はその関数によって宣言されたすべての永続変数もクリアします。MATLAB が終了するまで関数をメモリに保持するには、mlockを使用します。

于 2012-12-13T00:50:23.103 に答える
0

グローバル変数は、使用されるすべての場所で宣言する必要があります。global dataを必要な場所に追加するだけで機能します。

于 2012-12-12T20:31:40.347 に答える
0

これは、matlab でのグローバル変数の宣言の複製ではありません。グローバル var はすべての関数にしかアクセスできませんが、スクリプトが完了すると、グローバル変数がなくなるため、再度メモリに読み込む必要があります。

必要なのは、ローカル変数をベース ワークスペースに移動し、他の関数呼び出し中に再びアクセスすることです。私は実際に自分で解決しましたが、今このコードで

function main()
  try
    Data = evalin('base','Data'); % Move back from base workspace
    fprintf('Already loaded...\n');
  catch
    fprintf('Loading data...');
    data = load biigdatafile.mat;
    assignin('base', 'Data', Data); % Move to base workspace
    fprintf('Ok\n');
  end

  showDocID(Data{1});
end

function showData(Data)
  fprintf(['Data: "' Data '"\n']);
end
于 2012-12-12T21:22:07.100 に答える