web-dev-qa-db-fra.com

Appel des fonctions MATLAB à partir de python

Est-il possible d'exécuter des fonctions MATLAB depuis Python? Je recherche sur Internet, je n'ai pu trouver que PyMat. La mauvaise chose est que la version compilée ne prend en charge que Python2.2 et j'utilise 2.6. J'ai donc essayé de télécharger le code source, donc je peux le compiler pour moi. Mais je ne peux pas le compiler, VC++ express ne semble pas avoir les fonctionnalités nécessaires pour le compiler. Quelqu'un a-t-il la version de compilation pour PC? ou des substituts de PyMat? Merci

51
Hossein

PyMat semble avoir été abandonné.

Je suppose que vous êtes sur Windows afin que vous puissiez toujours faire l'approche la plus simple et utiliser l'interface COM de Matlab:

>>> import win32com.client
>>> h = win32com.client.Dispatch('matlab.application')
>>> h.Execute ("plot([0 18], [7 23])")
>>> h.Execute ("1+1")
u'\nans =\n\n     2\n\n'

Plus d'infos ici

25
Mark

Je sais que c'est une vieille question à laquelle on a répondu. Mais je cherchais la même chose (pour le Mac) et j'ai trouvé qu'il y avait pas mal d'options avec différentes méthodes d'interaction avec matlab et différents niveaux de maturité. Voici ce que j'ai trouvé:

pymat

Une interface de bas niveau vers Matlab utilisant le moteur matlab (libeng) pour la communication (essentiellement une bibliothèque fournie avec matlab). Le module doit être compilé et lié à libeng.

http://pymat.sourceforge.net
Dernière mise à jour: 2003

pymat2

Poursuite quelque peu éphémère du développement du pymat. Semble fonctionner sur Windows (y compris 64 bits), Linux et Mac (avec quelques modifications).

https://code.google.com/p/pymat2/
Dernière mise à jour: 2012

mlabwrap

Une interface de haut niveau qui se présente également comme un module qui nécessite une compilation et une liaison avec libeng. Il expose les fonctions Matlab à python afin que vous puissiez faire des trucs amusants comme

mlab.plot(x, y, 'o')

http://mlabwrap.sourceforge.net
Dernière mise à jour: 2009

mlab

Un effort de reconditionnement de mlabwrap. Fondamentalement, il remplace le code c ++ qui lie contre "libeng" dans mlabwrap avec un module python ( matlabpipe ) qui communique avec matlab à travers un tuyau. Le principal avantage de cela est qu'il n'a pas besoin de compilation de toute nature.

Malheureusement, le paquet contient actuellement quelques bugs et ne semble pas fonctionner du tout sur le mac. J'en ai signalé quelques-uns mais j'ai finalement abandonné. Aussi, préparez-vous à beaucoup de ruse et à un tas de hacks assez laids si vous devez entrer dans le code source ;-) Si cela devient plus mature, cela pourrait être l'une des meilleures options.

https://github.com/ewiger/mlab
dernière mise à jour: 2013

pymatlab

Un package plus récent (2010) qui interagit également avec Matlab via libeng. Contrairement aux autres packages, celui-ci charge la bibliothèque du moteur via ctypes donc aucune compilation n'est requise. Ce n'est pas sans défauts mais toujours maintenu et les problèmes (spécifiques au Mac 64 bits) que j'ai trouvés devraient être assez faciles à résoudre.
( edit 2014-05-20 : il semble que ces problèmes ont déjà été corrigés dans la source, donc tout devrait bien se passer avec 0.2. 4)

http://pymatlab.sourceforge.net
dernière mise à jour: 2014

pont-python-matlab

Également un package plus récent qui est toujours activement maintenu. Communique avec Matlab via une sorte de socket. Malheureusement, les fonctions exposées sont un peu limitées. Je ne pouvais pas comprendre comment invoquer une fonction qui prend des structures comme paramètres. Nécessite zmq, pyzmq et IPython qui sont assez faciles à installer.

http://arokem.github.io/python-matlab-bridge
dernière mise à jour: 2014

33
Lukas

Une autre option est Mlabwrap :

Mlabwrap est une passerelle de haut niveau python vers Matlab® qui permet à Matlab de ressembler à une bibliothèque normale python.

Cela fonctionne bien avec les tableaux numpy. Un exemple de la page d'accueil:

>>> from mlabwrap import mlab; from numpy import *
>>> xx = arange(-2*pi, 2*pi, 0.2)
>>> mlab.surf(subtract.outer(sin(xx),cos(xx)))
29
ars

Il existe un pont python-matlab qui est unique dans le sens où Matlab s'exécute en arrière-plan, vous n'avez donc pas le coût de démarrage à chaque fois que vous appelez une fonction Matlab. https://github.com/jaderberg/python-matlab-bridge

c'est aussi simple que le téléchargement et le code suivant:

from pymatbridge import Matlab
mlab = Matlab(matlab='/Applications/MATLAB_R2011a.app/bin/matlab')
mlab.start()
res = mlab.run('path/to/yourfunc.m', {'arg1': 3, 'arg2': 5})
print res['result']

où le contenu de yourfunc.m ressemblerait à ceci:

%% MATLAB
function lol = yourfunc(args)
    arg1 = args.arg1;
    arg2 = args.arg2;
    lol = arg1 + arg2;
end
10
Max Jaderberg

Je voudrais ajouter une autre option à l'excellent résumé de Lukas:

matlab_wrapper

L'avantage de matlab_wrapper est qu'il est pur Python et vous n'aurez pas besoin de compiler quoi que ce soit. Fonctionne sous GNU/Linux, Windows et OSX.

https://github.com/mrkrd/matlab_wrapper

Avertissement: je suis l'auteur de matlab_wrapper

3
user3785802
3
ying17zi

Vous pouvez utiliser le moteur matlab officiel en installant Matlab, puis en construisant le moteur python à partir de ses fichiers externes. Vous pouvez consulter le site Web du guide ci-dessous: --- Merci pour les conseils dans le premier commentaire de ce réponse --- les étapes essentielles en bref sont (sur la plate-forme Windows, d'autres peuvent être vérifiées dans l'url ci-dessous): 1. téléchargez puis installez matlab, la version doit être R2014 ou ultérieure 2. ouvrez une fenêtre PowerShell sous admin, puis :

cd "matlabroot\extern\engines\python"

3. utilisez la ligne de commande ci-dessous pour installer:

python setup.py install

L'administrateur est essentiel, sinon vous ne réussirez pas à le créer.

Pour plus d'informations, vous pouvez cliquer sur la feuille de démarrage officielle ci-dessous: http://cn.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html

2
H.S.Xu

les versions plus récentes de matlab semblent fournir un module qui vous permet d'appeler les fonctions matlab depuis python. voir ici et ici .

2
user3820991

2 autres options à considérer:

  1. Suivez les documents officiels MATLAB: Créez une Python avec le code MATLAB . Cela créera une bibliothèque Python qui inclut le runtime MATLAB qui inclut vous pouvez appeler à partir de votre code Python.

  2. Exécutez votre code MATLAB dans GNU Octave puis appelez-le depuis Python en utilisant Oct2Py

2
Ron Kalian