web-dev-qa-db-ja.com

MATLABからPython関数を呼び出す

MATLABからPython関数を呼び出す必要があります。これを行うにはどうすればよいですか?

65
Sarah

私のシステムにも同様の要件があり、これが私の解決策でした:

MATLABにはPerl.mという関数があり、MATLABからPerlスクリプトを呼び出すことができます。使用しているバージョンに応じて、次のような場所に配置されます。

C:\Program Files\MATLAB\R2008a\toolbox\matlab\general\Perl.m

Python.mというコピーを作成し、Perlをpythonですばやく検索して置き換え、設定したコマンドパスを再確認して、Pythonのインストールをポイントします。これで、MATLABからpythonスクリプトを実行できます。

python "sqd.py"として保存された単純な二乗関数です。当然これを適切に行っていれば、入力引数や有効な数値などをテストする際にいくつかのチェックがあります。

import sys

def squared(x):
    y = x * x
    return y

if __== '__main__':
    x = float(sys.argv[1])
    sys.stdout.write(str(squared(x)))

その後、MATLABで

>> r=python('sqd.py','3.5')
r =
12.25
>> r=python('sqd.py','5')
r =
25.0
>>
42
Adrian

Matlab 2014bでは、pythonライブラリは matlabから直接 。プレフィックスpy.はすべてのパケット名に追加されます。

wrapped = py.textwrap.wrap(T); % calls textwrap.wrap in python
23
Daniel

このMEXファイルを実際に呼び出して、Python MATLABから他の方法ではなく他の方法で呼び出します。かなりまともな統合を提供します。 http://algoholic.eu/matpy/ =

次のようなことが簡単にできます。

[X,Y]=meshgrid(-10:0.1:10,-10:0.1:10);
Z=sin(X)+cos(Y);
py_export('X','Y','Z')
stmt = sprintf(['import matplotlib\n' ...
'matplotlib.use(''Qt4Agg'')\n' ...
'import matplotlib.pyplot as plt\n' ...
'from mpl_toolkits.mplot3d import axes3d\n' ...
'f=plt.figure()\n' ...
'ax=f.gca(projection=''3d'')\n' ...
'cset=ax.plot_surface(X,Y,Z)\n' ...
'ax.clabel(cset,fontsize=9,inline=1)\n' ...
'plt.show()']);
py('eval', stmt);
18
algoholic

CプログラムにPythonスクリプト)を埋め込む してから MATLABを使用してCプログラムをMEXする 結果をファイルにダンプします。

MATLAB関数を呼び出すには、Python PyMat を使用します。それとは別に、 SciPy にはいくつかのMATLAB重複関数があります。

しかし、MATLABからPythonスクリプトを実行する必要がある場合は、スクリプトを実行して結果をファイルに保存し、後でMATLABで読み込むために system コマンドを実行してみてください。 。

12
Jacob

@dgorissenが言ったように、Jythonは最も簡単なソリューションです。

homepage からJythonをインストールするだけです。

次に:

javaaddpath('/path-to-your-jython-installation/jython.jar')

import org.python.util.PythonInterpreter;

python = PythonInterpreter; %# takes a long time to load!
python.exec('import some_module');
python.exec('result = some_module.run_something()');
result = python.get('result');

いくつかの例については、 ドキュメント をご覧ください。

注意:私は実際にJythonを使用したことがないため、CPythonから知っている標準ライブラリはJythonに完全には実装されていないようです!

私がテストした小さな例は問題なく動作しましたが、Python codeディレクトリをsys.path

11
kay

これを行う最も簡単な方法は、 [〜#〜] matlab [〜#〜]system 関数を使用することです。

基本的に、コマンドプロンプト(Windows)またはシェル(Linux)で行うように、MATLABでPython関数を実行します。

system('python pythonfile.py')

上記は、単にPythonファイルを実行するためのものです。Python関数を実行し(引数を与える)場合は、 :

system('python pythonfile.py argument')

具体的な例として、この質問に対するエイドリアンの答えにあるPythonコードを取り、それをPythonファイル、つまりtest.py。次に、このファイルをMATLABディレクトリに配置し、MATLABで次のコマンドを実行します。

system('python test.py 2')

そして、出力として4または2 ^ 2を取得します。

注:MATLABは、現在のMATLABディレクトリで、systemコマンドで指定したPythonファイル)を探します。

これはおそらく、MATLABの既存の関数を使用して入札を行うため、問題を解決する最も簡単な方法です。

7
kyphos

Perl.mpython.mに適合させ、他の人のために参照用に添付しましたが、Pythonスクリプトからの出力をMATLABに返すことができないようです。変数:(

これが私のMファイルです。注:コード内でPythonフォルダーC:\python27_64を直接ポイントすると、これはシステム上で変更されます。

function [result status] = python(varargin)
cmdString = '';
for i = 1:nargin
    thisArg = varargin{i};
    if isempty(thisArg) || ~ischar(thisArg)
        error('MATLAB:python:InputsMustBeStrings', 'All input arguments must be valid strings.');
    end
    if i==1
        if exist(thisArg, 'file')==2
            if isempty(dir(thisArg))
                thisArg = which(thisArg);
            end
        else
            error('MATLAB:python:FileNotFound', 'Unable to find Python file: %s', thisArg);
        end
    end
  if any(thisArg == ' ')
    thisArg = ['"', thisArg, '"'];
  end
  cmdString = [cmdString, ' ', thisArg];
end
errTxtNoPython = 'Unable to find Python executable.';
if isempty(cmdString)
  error('MATLAB:python:NoPythonCommand', 'No python command specified');
elseif ispc
  pythonCmd = 'C:\python27_64';
  cmdString = ['python' cmdString];  
  pythonCmd = ['set PATH=',pythonCmd, ';%PATH%&' cmdString];
  [status, result] = dos(pythonCmd)
else
  [status ignore] = unix('which python'); %#ok
  if (status == 0)
    cmdString = ['python', cmdString];
    [status, result] = unix(cmdString);
  else
    error('MATLAB:python:NoExecutable', errTxtNoPython);
  end
end
if nargout < 2 && status~=0
  error('MATLAB:python:ExecutionError', ...
        'System error: %sCommand executed: %s', result, cmdString);
end

編集:

[〜#〜] path [〜#〜]を更新することにより、元のPerl.mがMATLABフォルダー内の Perl インストールを指す問題を解決しました。その後、Perlを呼び出します。上記の関数は、私のPythonインストールを指しています。 function.pyファイルを呼び出したとき、それは別のディレクトリにあり、そのディレクトリ内の他のファイルを呼び出していました。これらは[〜#〜] path [〜#〜]に反映されず、PythonファイルをPython配布。

4
Carel

Matlab 2014b以降Python関数は直接呼び出すことができます。プレフィックスpyを使用し、次にモジュール名、最後に次のように関数名を使用します。

result = py.module_name.function_name(parameter1);

Pythonスクリプトとは異なる作業ディレクトリにいる場合は、Matlabから呼び出すときに、スクリプトをPython検索パスに追加してください。

video で詳細を参照してください。

4
Altermarkive

[〜#〜] matlab [〜#〜]system()関数に関するほとんど知られていない(そしてほとんど ドキュメント化された )事実:unixoidシステムではMATLABの起動時に、環境変数Shellまたは_MATLAB_Shell_で指定されているインタープリターを使用します。したがって、MATLABを起動すると

_Shell='/usr/bin/python' matlab
_

後続のsystem()呼び出しは、インタープリターとしてデフォルトのシェルの代わりに Python を使用します。

4
quazgar

[〜#〜] matlab [〜#〜] はJavaとシームレスに統合されるため、 Jython を使用してスクリプトを記述し、MATLABから呼び出すことができます(追加する必要がある場合があります)実際にJythonコードを呼び出す薄い純粋なJKavaラッパー)。試したことはありませんが、なぜ機能しないのかわかりません。

3
dgorissen

ダニエルが言ったように、pyを使用してMatlabから直接pythonコマンドを実行できます。コマンド。ライブラリを実行するには、Malabがライブラリをインストールしたpython環境を実行していることを確認するだけです。

Macの場合:

  • 新しいターミナルウィンドウを開きます。

  • タイプ:which python(デフォルトバージョンのpythonがインストールされている場所を見つけるため);

  • Matlabを再起動します。

  • コマンドラインでpyversion( '/ anaconda2/bin/python')と入力します(明らかにパスに置き換えます)。
  • これで、デフォルトのpythonインストールですべてのライブラリを実行できます。

例えば:

py.sys.version;

py.sklearn.cluster.dbscan

2
Rodrigo Coelho

これは、 Python から [〜#〜] matlab [〜#〜] までの「トンネル」機能に適した方法のようです。

http://code.google.com/p/python-matlab-wormholes/

大きな利点は、それでndarrayを処理できることです。これは、以前に提案されたように、プログラムの標準出力では不可能です。 (これが間違っていると思うなら、私を修正してください-それは私に多くのトラブルを救うでしょう:-))

1
R. C.

Python はより良いグルー言語であるため、 [〜#〜] matlab [〜#〜] のプログラムの一部をPython。

Mlabwrap を確認してください。

0
Andrew Wagner