web-dev-qa-db-ja.com

そのパスを追加せずに、Matlabパス上にない関数を呼び出します

私は午後中ずっと検索していましたが、パスを指定し、パスにディレクトリを追加せずに、matlabで関数を呼び出す解決策が見つかりませんでした。

この質問は MATLABのパスにない関数を呼び出すことは可能ですか? と非常によく似ていますが、私の場合、組み込み関数を呼び出したくはありませんが、 mファイルで定義されている通常の関数。

ハンドルは解決策かもしれないと思いますが(パス上にない関数を参照できるようです)、ディレクトリにcd-してハンドルを作成し、そこにcd-を戻さないとハンドルを作成する方法が見つかりませんでした。関数ハンドルオブジェクトが何であるか、そしてパス上にない特定の関数への参照を使用してオブジェクトを作成する方法を「探索」しようとしても、私はどこにも行きませんでした。

したがって、解決策は2つの角度から来る可能性があります。
1)特定のディレクトリにmファイルのハンドルを作成する方法を知っています。
2)matlabパス上にない関数を呼び出す方法を知っています。

編集:ハンドルが参照しているファイルパスを実際に確認できる関数functions(myhandle)を発見しました。しかし、それでもそれを変更する方法はありません...

16

コメントに記載されている解決策 1 関数を呼び出す前に関数ハンドルを作成することは、@ Rody OldenhuisのFEX貢献によってうまく実装されています: http://www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles

5
Thierry Dalon

これは実行可能ですが、少しの解析とevalinの呼び出しが必要です。

私は(何年も前に!)MATLAB Central FileExchangeにexternalFcnという関数を追加しました。

http://www.mathworks.com/matlabcentral/fileexchange/4361-externalfcn

オフパス関数への呼び出しを管理します。たとえば、成功メッセージと入力の値を含む構造を返すだけのoffpathFcnという関数があります。その関数をMATLABパスから保存して、次を使用して呼び出すことができます。

externalfcn('out = C:\MFILES_OffPath\offpathFcn(''this is a test'')');

これは次を返します:

out = 
    success: 1
    input: 'this is a test'

(私の実装は制限されており、改善可能であることに注意してください。これを機能させるには、等号の出力を含める必要があります。ただし、目的を達成する方法が示されているはずです。)

(MathWorksアプリケーションエンジニア)

9
Brett Shoelson
function [varargout]=funeval(fun,varargin)
% INPUT:
% fun: (char) full path to function file
curdir=cd;
[fundir,funname]=fileparts(fun);
cd(fundir);
[varargout{1:nargout}] =feval(funname,varargin{:})
cd(curdir);
3
Thierry Dalon

いつも不快に感じるfevalの使用を避けるために、ThierryDalonのコードを変更しました。これはまだ問題のディレクトリへのcdを回避しないことに注意してください、しかしまあ、それは舞台裏で起こるので、起こらないふりをしてください:-)またBen Voigtが上で指摘したことに注意してください:ヘルパー関数の呼び出しはオフですパスは失敗します。

function [varargout]=funeval(FunctionHandle, FunctionPath, varargin)
% INPUT:
% FunctionHandle: handle to the function to be called; eg @MyFunction
% FunctionPath: the path to that function
% varargin: the arguments to be passed to Myfunction
curdir=cd;
cd(FunctionPath)
[varargout{1:nargout}] = FunctionHandle(varargin{:});
cd(curdir);
end

それを呼び出すと次のようになります

Output = funeval(@MyFunction, 'c:\SomeDirOffMatlabsPath\', InputArgToMyFunc)
2
user2965459

run コマンドは、任意のディレクトリからスクリプトファイルを実行できますが、関数を呼び出すことはできません(入力引数と出力引数を使用)。

fevalstr2funcも、関数文字列内のディレクトリ情報を許可しません。

str2funcの独自のラッパーを作成することをお勧めします。

  • 作業ディレクトリを保存します
  • ディレクトリをスクリプトディレクトリに変更します
  • 関数ハンドルを作成します
  • 元の作業ディレクトリを復元します

ただし、パスにない関数へのハンドルは破損する可能性があることに注意してください。関数は、そのディレクトリ内の他のファイルに格納されているヘルパーコードを呼び出すことができないためです。

1
Ben Voigt