1

matlabで複数の変数を効率的に定義する方法はありますか? 私が見つけたものはすべて、私が探しているものとはまったく異なります。状況は次のとおりです。

parstrs = {'a','b','c'};
parvals = [1 2 3];

実際には次のことを行う効率的なコマンドが必要です。

parstrs = parvals;

その結果、数値 1 は変数aに格納され、2 は に格納されb、3 は に格納されますc

私はセルまたは構造体でこれを行うことにオープンです。

助言がありますか?

より明確にする: 後述するように、カーブ フィッティングで使用する変数名のリストの長さを気にしないコードを書きたいと思います。私が発見した最善の方法は、次のような構造を使用することです。

parstrs = {'a','b','c'};
parvals = num2cell([1 2 3]);
partmp = {parstrs{:};parvals{:}};
pars = struct(partmp{:});

これの問題は、pars 構造を同じ方法で編集できないことです。あれは、

pars = setfield(pars,partmp{:});

次のエラーがスローされます。

 Error using setfield (line 48)
 Inputs must be either cell arrays or strings. 
4

6 に答える 6

2

evalを探していますが、おそらくまだループが必要です (はい、長いコマンドを生成できますが、本当にそれが必要ですか?):

ループ (これは使用しないでください!):

for ii=1:numel(parvals)
    eval([parstrs(ii) '=parvals(' ii ')']);
end

evalほとんどの場合、まったく必要なく、落胆します。セルに変更すると、管理と使用がはるかに簡単になります。すでにベクトルに変数がありますが、それらを検査するためにインデックスを使用するだけの問題は何ですか?

アプリケーションについてもう少し説明してください。そうすれば、あなたが本当に何を求めているのか、なぜこの種の変数割り当てを本当に使いたいのかを理解できるようになります。

GUI からベースの matlab 環境に変数をエクスポートするには、evalinに切り替えて、次のように使用します。

function main_gui()

    % do your thing, generate some values
    parvals = [1 2 3];

    % now is the time to export
    give_me_my_vars({'a','b','c'});

    % note that the following function is nested:
    function give_me_my_vars(parstrs)
        for ii=1:numel(parvals)
             evalin('base',[parstrs(ii) '=' parvals(ii)]);
        end
    end
end

これは、文字列に収まる単純なスカラーに対してのみ可能です。実際には、あるワークスペースから別のワークスペース (GUI からベース) に変数を切り替える何かを探したいと思っていると思いますが、それが可能かどうかはわかりません。

于 2013-07-07T18:30:47.823 に答える
1

次のようparstrsに値を取得したフィールド名を持つ構造体を作成できます。parvals

parstrs = {'a', 'b', 'c'};
parvals = [1 2 3];

nValues = length(parvals);

for iValue = 1:nValues
    s.(parstrs{iValue}) = parvals(iValue);
end

構造体sは次のようになります。

s = 
    a: 1
    b: 2
    c: 3

の代わりにa = 1、あなたが持っているでしょうがs.a = 1、それ以外の場合はあなたが求めていたものだと思います.

于 2013-07-08T16:45:04.850 に答える
0

次のようなことができます:

[a, b] = function_returning_values();

も使用できますeval

于 2013-07-07T18:25:46.653 に答える