9

MATLAB で関数を使用するinlineと、以前の選択に応じて異なる応答をする単一の関数名を作成できます。

if (someCondition)
  p = inline('a - b','a','b');
else
  p = inline('a + b','a','b');
end

c = p(1,2);
d = p(3,4);

しかし、私が作成しているインライン関数は非常に壮大なものになっているので、他のタイプの関数 (つまり、m ファイル、サブ関数、またはネストされた関数) に変更したいと考えています。

Mercator.m、 などのm-ファイル(すべておよびKavrayskiyVII.mの値を取る) があり、選択した関数を上記と同じ方法で に割り当てて、何度も呼び出すことができるとします (可変サイズの行列と、使用が不可能または完全に混乱するもの)。philambdapeval

type必要な関数の名前の 1 つになる変数 があります(例: 'Mercator''KavrayskiyVII'など)。変数p内で名前が付けられた関数へのポインターにする必要があると思います。typeどうすればこれを行うことができますか?

4

1 に答える 1

19

オプション1:

関数を使用します(文字列が関数の名前と同じstr2funcであると仮定します):type

p = str2func(type);  % Create function handle using function name
c = p(phi, lambda);  % Invoke function handle

注:ドキュメントには、次の制限事項が記載されています。

を使用して作成された関数ハンドルstr2funcは、ローカル ワークスペース外の変数や入れ子関数にはアクセスできません。関数ハンドルにこれらの変数または関数が含まれている場合、ハンドルを呼び出すと、MATLAB® はエラーをスローします。

オプション #2:

SWITCHステートメントと関数ハンドルを使用します。

switch type
  case 'Mercator'
    p = @Mercator;
  case 'KavrayskiyVII'
    p = @KavrayskiyVII;
  ...                    % Add other cases as needed
end
c = p(phi, lambda);      % Invoke function handle

オプション #3:

EVAL関数ハンドルを使用します ( Andrew Jankeによる提案):

p = eval(['@' type]);  % Concatenate string name with '@' and evaluate
c = p(phi, lambda);    % Invoke function handle

Andrew が指摘するように、これstr2funcにより、switch ステートメントの制限とそれに関連する余分なメンテナンスが回避されます。

于 2009-11-30T16:23:47.127 に答える