1

一連の変数を含むワークスペースがあります (例: 、var1var2var3var4およびvar5) 。.m 関数があります ( to の既定値を格納するために使用します。ユーザーは、変数とその既定値をワークスペースに追加するために、Matlab を開いてこの関数を実行します。その後、ユーザーはいくつかの変数の値を変更する可能性があります。またはいくつかの変数を削除することさえできます。var6var7assignin('base',...)var1var7

ここで、ユーザーが変数値を変更し、関数を再度実行した場合、ユーザーが入力した新しい値をデフォルト値で上書きしたくありません。

ここに私がこれまでに持っているもの:

S = evalin('base','whos');
listWorkspaceVar = {S.name};
compareCellArrayList = ismember(listWorkspaceVar, listParam); % logical vector, listParam is the list of variables in the function assigning the default values, so here listParam would be = {'var1' 'var2' 'var3' 'var4' 'var5' 'var6' 'var7'})
if any(compareCellArrayList) % check if there is at least one declared variable in the base workspace
    tempWorkspaceVarVal = cell(sum(compareCellArrayList),2); % Pre-allocating, 1 column for the variable name and 1 column for the variable value
    jj = 1;
    for ii = 1:size(S,1)
        if compareCellArrayList(1, ii)
            tempWorkspaceVarVal(jj,:) = {listWorkspaceVar{1, ii}, ...
                                         evalin('base',listWorkspaceVar{1, ii})}; 
            jj = jj + 1;
        end
    end
    theDefaultValueFunction() % The function that assignin the default values
    cellfun(@(x,y) assignin('base', x, y), ...
            tempWorkspaceVarVal(:,1), tempWorkspaceVarVal(:,2)) % Overwrite with the temp values in order to keep the new entered values
end

関数 assignin のデフォルト値を変更したくない場合、新しく変更された変数値を保持するのに最適な方法はありますか?

4

4 に答える 4

2

これには関数を使用するのではなく、スクリプトを使用する必要があると思います。スクリプトは呼び出し元のワークスペースで動作します。したがって、コマンド ラインから呼び出された場合、これがベース ワークベースになります。assigninもう 1 つの利点は、デバッグ中に本当に苦労することがある を必要としないことです。

exist('var1', 'var')コマンドを使用すると、変数var1が既に存在するかどうかを確認でき、したがって (再) 初期化する必要はありません。

メタ matlab コードで:

if ~exist('var1', 'var')
    % var1 does not exist
    var1 = zeros(10, 5);
end
于 2013-08-30T13:25:42.000 に答える
1

少なくともほんの数行のコードを theDefaultValueFunction() に追加するだけのクールな場合は、これはあなたが試すことができるクレイジーなソリューションです。

function theDefaultValueFunction()

persistent hasRunOnce  % creates a empty matrix
if isempty(hasRunOnce) % Check if the function has already run
    % Your function code here
end
hasRunOnce = true;

関数が初めて実行された後、hasRunOnce 変数が設定され、関数はワークスペース変数をそれ以上変更しません。永続変数は関数内でローカル スコープを持ちますが、グローバル変数のようにメモリに格納されます。

永続変数をクリアするには、関数をクリアする必要があります。

clear theDefaultValueFunction
于 2013-08-30T15:31:39.593 に答える
0

関数 (返さない) が必要で、ベース ワークスペースから値を取得し、それらを編集する場合は、おそらくグローバル変数が必要になります。

ただし、これが必要かどうかはよく考えてください。関数が単に変数を返すようにするか、変数をファイルに保存することを検討してください。一般に、グローバル変数は推奨されませんが、現在のアプローチよりも優先します。

于 2013-08-30T13:27:27.737 に答える
0

これは間違いなく最善の方法ではありません。しかし、これは簡単で、多くの時間を節約できると思います。

function theDefaultValueFunction()

save('workspace.mat') % save all of the workspace, save it in a place with write permissions

% your code here

load('workspace.mat') % updates the variables into their old values (i.e user changed values), 
                      % any new variables (recreated by the function) remain unaffected

delete workspace.mat
于 2013-08-30T19:04:05.963 に答える