9

変数名を構造体フィールドとして使用して、変数のコレクションを構造体の「中に」ダンプする簡単な方法 (つまり、1 行) はありますか? 「ロード」機能は基本的にこれを行いますが、一時ファイルへの保存とロードは醜いようです。

例えば:

clear
a = 'adsf'
b = rand(10);

x = var2struct(a,b)

x.a
x.b

またはさらに良い:

x = var2struct(['a';'b'])

また、その逆 (つまり、フィールド値をフィールドにちなんで名付けられた変数として現在のスコープにダンプする) はどうですか?:

clear
x.a='asdf'
x.b=rand(10);
dumpstruct(x)
a
b 

また、関連するニュースグループ スレッドは次のとおりです。

4

1 に答える 1

18

LOADSAVEを使用する以外に、これを行うための組み込み関数はありません。ただし、次のように独自の関数を作成することもできます。

function s = var2struct(varargin)
  names = arrayfun(@inputname,1:nargin,'UniformOutput',false);
  s = cell2struct(varargin,names,2);
end

function struct2var(s)
  cellfun(@(n,v) assignin('base',n,v),fieldnames(s),struct2cell(s));
end

ベース ワークスペースから作業すると、次のようにこれらの関数を使用できます。

a = 'adsf'
b = rand(10);
x = var2struct(a,b);
clear a b
struct2var(x);

いくつかのメモ:

  • 変数自体ではなく変数名として引数を指定したい場合var2structは、次の代替関数を使用できます。

    function s = var2struct(varargin)
      values = cellfun(@(n) evalin('base',n),varargin,'UniformOutput',false);
      s = cell2struct(values,varargin,2);
    end
    

    これをベース ワークスペースから次のように使用します。

    x = var2struct('a','b');
    

    残念ながら、このバージョンの関数を使用して、関数のワークスペースではなく、ベース ワークスペースから変数を取得することしかできません。

  • 上記の関数に関する 1 つの注意点struct2varは、関数呼び出しのワークスペースではなく、常にベース ワークスペースに変数が作成されることstruct2varです。ベース以外のワークスペースで変数を作成するには、 を呼び出す代わりに、そのワークスペースで次の行を使用する必要がありますstruct2var

    cellfun(@(n,v) assignin('caller',n,v),fieldnames(x),struct2cell(x));
    
于 2010-08-12T18:18:29.683 に答える