Main Content

assignin

指定ワークスペースの変数に値を割り当てる

説明

assignin(ws,var,val) は、値 val をワークスペース ws の変数 var に割り当てます。たとえば、assignin('base','x',42) は値 42 を MATLAB® ベース ワークスペース内の変数 x に割り当てます。

val の評価が必要な場合、MATLAB は ws で指定されたワークスペース内ではなく、assignin を呼び出す関数内で評価します。val が関数ハンドルである場合、これは assignin を呼び出す関数内で評価できなければなりません。

関数 assignin は、以下のタスクで役立ちます

  • 関数からベース ワークスペースにデータをエクスポートする。

  • 関数の内部から、呼び出し側の関数のワークスペース内で定義された変数値を変更する。たとえば、呼び出し元の関数の引数リスト内にある変数値を変更できます。

すべて折りたたむ

現在の作業フォルダー内のファイルに、2 つの数値を加算する関数を作成してから、値をベース ワークスペース内の変数 fcnStatus に割り当てます。

function c = myAdd(a,b)
    c = a+b;
    
    str = sprintf('%s called with %d,%d (%s)',mfilename,a,b,char(datetime));
    assignin('base','fcnStatus',str)
end

コマンド プロンプトで関数を呼び出します。

n = myAdd(2,3)
n =

     5

関数 myAdd がベース ワークスペース内で変数 fcnStatus に割り当てた値を表示します。

fcnStatus
fcnStatus =

    'myAdd called with 2,3 (17-Nov-2017 14:56:14)'

現在の作業フォルダー内のファイルに、名前と生年を入力するダイアログ ボックスを表示して 2050 年での年齢を計算する関数を作成します。関数 assignin は、MATLAB ワークスペース変数 nameage2050 に値をエクスポートします。

function mydialog
    prompt = {'Enter name:','Enter birth year:'};
    answer = inputdlg(prompt);
    
    n = answer{1};
    birthyear = str2double(answer{2});
    a = 2050-birthyear;
    
    assignin('base','name',n);
    assignin('base','age2050',a);
end

コマンド プロンプトでこの関数を実行し、データを入力して [OK] をクリックします。

mydialog

Screenshot of dialog box.

エクスポートした値をワークスペース ブラウザーで表示します。

入力した年齢を 42 に変更する関数を作成します。localfcn 内にある assignin の呼び出しが、メイン関数 updateAge のワークスペース内にある a の値を変更します。

function updateAge(a)
    validateattributes(a,{'numeric'},{'scalar'})
    fprintf('\tYour age: %d\n',a)
    localfcn
    fprintf('\tYour updated age: %d\n',a)
end

function localfcn
    assignin('caller','a',42)
end

コマンド プロンプトでこのメイン関数を呼び出します。

updateAge(37)
	Your age: 37
	Your updated age: 42

この例では呼び出し側ワークスペース内に変数を割り当てる方法を説明していますが、ベスト プラクティスはローカル関数 localfcn で更新された年齢を出力引数として返すことです。

現在の作業フォルダー内のファイルに、乱数の配列の最小値を検出する関数を作成します。ローカル関数 assignfh は関数ハンドル fhminRand のワークスペース内に割り当てます。関数 minRand は入力 n を使用して fh を評価します。

function m = minRand(n)
    assignfh
    
    A = fh(n)
    m = min(A(:));
end

function assignfh
    fh = @(dim)rand(dim);
    assignin('caller','fh',fh)
end

入力値 2 を指定して関数を呼び出します。

m = minRand(2)
A =

    0.3486    0.1423
    0.0419    0.0766


m =

    0.0419

この関数ハンドルは 2 行 2 列の乱数の配列として評価されます。

この関数の minRand2 という別のバージョンを作成します。このバージョンではローカル関数が関数ハンドルの定義内の関数 rand をオーバーライドします。

minRand の例と同様に、ローカル関数 assignfh2fhminRand2 のワークスペース内に割り当てます。関数 assignfh2rand という名前の変数でそのワークスペース内の関数 rand をオーバーライドし、関数ハンドルを作成します。この動作は無名関数と一致します。作成時に利用可能な変数を使用して関数ハンドルが作成されます。したがって、minRand2 で関数ハンドルを評価すると、assignfh2 で定義された配列 randn のインデックスが付けられます。

function m = minRand2(n)
    assignfh2(n)
    
    A = fh(n)
    m = min(A(:));
end

function assignfh2(n)
    rand = 13*ones(n);
    fh = @(dim)rand(dim);
    assignin('caller','fh',fh)
end

入力値 2 を指定して関数を呼び出します。

m = minRand2(2)
A =

    13


m =

    13

呼び出し側ワークスペースに無名関数を割り当てる場合、MATLAB は呼び出し側ワークスペース内の変数に関数ハンドルの定義を入れます。assignin への呼び出しをもつ関数が関数ハンドルを評価します。この例では呼び出し側ワークスペースに変数を割り当てる方法を説明していますが、ベスト プラクティスはローカル関数 assignfh で関数ハンドルを出力引数として返すことです。

入力引数

すべて折りたたむ

ワークスペース。'base' または 'caller' として指定します。

MATLAB ベース ワークスペース内で値を割り当てるには、'base' を使用します。ベース ワークスペースは MATLAB コマンド プロンプトで作成した変数を保存します。これには、スクリプトがコマンド ラインまたはエディターから実行される前提で、スクリプトが作成する変数がすべて含まれます。

呼び出し側の関数のワークスペース内で変数を割り当てるには、'caller' を使用します。呼び出し側のワークスペースは、現在実行中の関数を呼び出した関数のワークスペースです。たとえば、funAfunB を呼び出すと仮定します。funB の呼び出し側のワークスペースは funA です。したがって、assignin を使用してワークスペースを 'caller' として指定することで、funB から funA の変数に値を割り当てることができます。

メモ

呼び出し側のワークスペースの変数に割り当てることで、コードがより分かりにくくなったり、予期しない結果 (ワークスペースに予期しない変数または再定義された変数) が発生したり、パフォーマンスに悪影響を及ぼす可能性があります。ベスト プラクティスは、関数で変数を出力引数として返すことです。

ベース ワークスペースと呼び出し側のワークスペースは、以下の場合に同等になります。

  • コマンド プロンプトで関数を呼び出し、メイン関数が assignin を呼び出す場合

  • コマンド プロンプトで assignin を呼び出す場合

データ型: char | string

変数名。文字ベクトルまたは string スカラーとして指定します。指定したワークスペースに var が存在しない場合、関数 assignin によって作成されます。

データ型: char | string

変数の値。スカラーまたは配列の値として指定します。val には任意のデータ型を指定でき、MATLAB 式を含めることができます。

変数の値を評価する必要がある場合、ws で指定されたワークスペース内ではなく、assignin の呼び出しを含む関数内で MATLAB は式を評価します。val が関数ハンドルである場合、これは assignin を呼び出す関数内で評価できなければなりません。

例: 5

例: 'hello'

例: rand(3,7)

例: @cos

ヒント

  • 関数 assignin は、配列の特定要素に値を割り当てません。したがって、var は配列インデックスを含むことができません。このコードはエラーになります。

    X = 1:8;
    assignin('base','X(3:5)',-1);
    

    配列の特定要素に値を割り当てるには、関数 evalin を使用します。

    evalin('base','X(3:5) = -1')
    

拡張機能

バージョン履歴

R2006a より前に導入