MATLAB et Python ont chacun leurs avantages. MATLAB est fort dans les opérations matricielles et ses points forts incluent les documents japonais et l'existence de Simlink. D'autre part, l'utilisation de Python est gratuite et les bibliothèques d'apprentissage automatique riches telles que scicit-learn sont attrayantes. Par conséquent, vous souhaiterez peut-être les utiliser correctement.
Pour un tel cas, il existe Possibilité d'appeler Python directement depuis MATLAB. (Au contraire, vous pouvez également Appeler la fonction MATLAB depuis Python, mais je n'y toucherai pas cette fois.)
Cependant, même si je le recherche, le document officiel n'est pas très pratique [^ exemple]. Par conséquent, cette fois, je vais organiser et résumer ** les informations qui semblent utiles dans la pratique **.
Dans le passé, il y avait des moments où je voulais traiter la partie d'apprentissage automatique avec Python et utiliser MATLAB pour préparer des données d'entraînement et évaluer le modèle. Vous pouviez écrire et exécuter le code dans chaque langue et échanger les résultats dans un fichier dat ou un fichier mat, mais c'était un peu gênant. Alors, quand j'ai découvert cette fonction, je me suis dit: "Je peux vous faciliter la tâche!" (En fait, la conclusion que j'ai examinée était "** L'appel Python de MATLAB n'est pas souhaitable **")
[^ exemple]: Il n'y a qu'un exemple de textwrap.wrap, et je n'ai aucune idée de comment utiliser réellement numpy etc ... (je pense que je voulais l'expliquer uniquement avec la bibliothèque standard)
Avant de l'utiliser avec MATLAB, vous devez installer l'interpréteur Python et enregistrer son chemin. Cependant, python a Version officielle et Version Anaconda, donc la procédure change un peu. Je vais.
Pour utiliser la version officielle de Python.org, installez selon Explication here. seulement.
En revanche, si le chemin n'est pas passé dans l'environnement Anaconda ou dans la version officielle, il est nécessaire de définir le chemin individuellement sur MATLAB.
Tout d'abord, recherchez le chemin de l'interpréteur que vous souhaitez utiliser.
Ensuite, définissez le chemin vérifié par la fonction pyversion
.
Par exemple, pour utiliser l'environnement hogehoge
d'Anaconda, écrivez comme suit.
executable = [getenv('userprofile'),...
'\AppData\Local\Continuum\anaconda3\envs\hogehoge\python.exe'];
pyversion(executable);
clearvars executable;
Exécutez pyversion
sans argument pour voir s'il est correctement configuré.
Si la version est affichée, cela devrait être correct.
Ensuite, appelons une fonction Python.
Pour appeler une fonction nommée command
en Python depuis MATLAB, utilisez simplement py.command
.
Par exemple, si vous souhaitez exécuter la fonction d'impression python, procédez comme suit.
py.print("Hello world!");
Cependant, il convient de noter que MATLAB et Python ont des types de données et une syntaxe intégrés différents. Par exemple, même si c'est possible en Python, la notation suivante n'est pas autorisée.
py.print("{0} {1}".format("Hello", "world!"));
% py.print("{0} {1}".format("Hello", "world!"));
% ↑
%Erreur:Opérateur MATLAB inattendu.
Pour une exécution correcte, le type de chaîne MATLAB est explicitement converti en type de chaîne Python (https://jp.mathworks.com/help/matlab/matlab_external/handling-data-returned-from- python.html) Vous devez le faire.
py.print(py.str("{0} {1}").format("Hello", "world!"));
Ensuite, à propos de Comment importer des packages Python.
La page ci-dessus décrit l'équivalent syntaxique de from x import y
en python.
Cependant, en pratique, une syntaxe comme ʻimport numpy as np` est souvent utilisée.
Cela peut être écrit comme suit à partir de [Implémentation de l'instruction d'importation] du côté python (https://docs.python.org/ja/3/library/importlib.html).
%Code équivalent à importer numpy en tant que np en Python
np = py.importlib.import_module('numpy');
La conversion du type de données se produit lors de l'échange de données entre MATLAB et Python. La conversion automatique est MATLAB vers Python, [Python vers MATLAB](https: // Il est organisé dans jp.mathworks.com/help/matlab/matlab_external/handling-data-returned-from-python.html#buialof-53). Ici, lors du passage d'un vecteur 1 par N à Python, il est automatiquement converti en type tableau intégré. Cependant, la matrice M-by-N ne semble pas être convertie automatiquement.
matrix = np.array(rand(2));
%Erreur: py.builtin_function_or_method/subsref
% MATLAB 'double'La conversion en Python est 1-Uniquement pris en charge pour N vecteurs.
Par conséquent, il semble qu'il puisse être converti en forme ndarray en procédant comme suit en utilisant le fait que le tableau de cellules de Matlab est automatiquement converti en Python taple.
mat_org = rand(2);
for i = 1:size(mat_org, 1)
mat_cell{i} = mat_org(i, :);
end
matrix = np.array(mat_cell);
disp(mat_org); %Matrice d'origine(MATLAB)
py.print(matrix); %Matrice après conversion(ndarray)
Il est difficile d'écrire une instruction for à chaque fois, il est donc préférable de l'utiliser comme une fonction.
mat2ndarray.m
function ndarray = mat2ndarray(mat)
% ndarray = mat2ndarray(mat)Convertir la matrice au format python ndarray et retourner
validateattributes(mat, {'numeric'}, {'2d'})
n_rows = size(mat, 1);
mat_cell = cell([1, n_rows]);
for r = 1:n_rows
mat_cell{r} = mat(r, :);
end
ndarray = py.numpy.array(mat_cell);
end
En python, Spécifiez le nom du paramètre et transmettez-le à la fonction peut se produire. Dans ce cas, le problème est que la syntaxe est différente entre MATLAB et Python. La solution est d'utiliser la MATLAB fonction pyargs.
Par exemple, pour calculer la moyenne de chaque colonne d'une matrice avec numpy, procédez comme suit.
mat = mat2ndarray(rand(2));
%Np en Python.average(a=mat, axix=0)Équivalent à
ave = np.average(pyargs('a', mat, 'axis', py.int(0)));
Il convient de noter ici que MATLAB traite essentiellement les nombres comme des types doubles.
Lorsque le traitement en Python est terminé, vous retournerez au type de base de MATLAB et le tracerez. Dans ce cas, il est nécessaire de convertir en une matrice MATLAB, mais elle ne peut pas être simplement convertie comme indiqué ci-dessous.
n_mat = np.average(pyargs('a', mat2ndarray(rand(2)), 'axis', py.int(0))); %Certains résultats de traitement
double(n_mat); %Je veux convertir en une matrice matlab
%Erreur: double
% py.numpy.Impossible de convertir ndarray en double.
Par conséquent, il doit être converti ainsi que [Comment passer une matrice](# Comment passer une matrice (MATLAB à ndarray)).
Par conséquent, une fois converti en un vecteur de type ʻarray.array, utilisez les informations de
ndarray.shape` pour [remodeler la fonction](https://jp.mathworks.com/help/matlab/ref/reshape. Façonnez-le avec html).
Plus précisément, il peut être converti avec la fonction suivante [^ refdiscussion].
function mat = ndarray2mat(ndarray)
% mat = narray2mat(mat)Convertit la matrice de format narray python en matrice de format MATLAB et retourne
validateattributes(ndarray, {'py.numpy.ndarray'}, {'scalar'});
np = py.importlib.import_module('numpy');
shape = cell(ndarray.shape); %Lire la forme
shape = cellfun(@(x) int64(x), shape); % py.Convertir int en int64
if shape == 1
%Pour les scalaires, évitez les erreurs
shape = [1, 1];
end
%Lire les données sous forme de vecteur
data = py.array.array(ndarray.dtype.char, np.nditer(ndarray));
data = double(data); % py.array.Convertir le tableau en double
mat = reshape(data, shape); %Organiser la forme dans une matrice
end
[^ refdiscussion]: J'ai fait référence à cette discussion.
Affiche le résultat avec matplotlib sans s'appuyer sur l'outil de traçage de MATLAB [^ matplotlib]. Cependant, dans mon environnement (Anaconda), une erreur liée à Qt s'est produite et je n'ai pas pu tracer.
Ainsi, lorsque j'ai ajouté des variables d'environnement en faisant référence à cet article, j'ai pu bien tracer. Vous trouverez ci-dessous le code pour ajouter le chemin Qt pour l'environnement hogehoge.
QtPath = [getenv('userprofile'),...
'\AppData\Local\Continuum\anaconda3\envs\hogehoge\Library\plugins'];
setenv('QT_PLUGIN_PATH', [getenv('QT_PLUGIN_PATH'), QtPath]);
clearvars QtPath;
Si vous écrivez ce code dans startup.m
, vous pouvez le tracer correctement.
[^ matplotlib]: Il est étrange d'utiliser matplotlib, qui fournit des graphiques de type MATLAB, sur MATLAB ...
Cependant, je pense que matplotlib est meilleur pour le jeu de couleurs par défaut.
Si vous utilisez Python, vous souhaitez utiliser scicit-learn ou seaborn. Cependant, il semble que ceux-ci ne peuvent être importés pour une raison quelconque.
%Je ne vois même pas l'aide ...
py.help('seaborn')
% problem in seaborn - ImportError: DLL load failed:La procédure spécifiée est introuvable.
Si quelqu'un connaît la cause ou la solution, faites-le moi savoir ...
Ce qui précède est la méthode d'utilisation de Python de MATLAB dans la plage que j'ai étudiée. En conclusion, j'ai pensé qu'il serait extrêmement plus facile d'exécuter ** individuellement et de remettre les fichiers **. Je pense qu'il est beaucoup plus facile d'écrire un processus pour transmettre un fichier csv à l'aide d'une bibliothèque que d'apprendre à appeler Python à partir de MATLAB.
<! - De plus, si vous définissez le processus pour transférer des fichiers, le transfert vers d'autres langues sera fluide. ->
De plus, dans mon environnement, il est fatal que ** scikit-learn ne puisse pas être utilisé **. S'il ne s'agit que de fonctions numpy et scipy, je pense que les fonctions intégrées de MATLAB sont plus puissantes.
De plus, spyder et pycharm fournissent un support tel que la complétion de code forte, mais MATLAB fournit un support médiocre.
Compte tenu de ce qui précède, l '"appel Python de MATLAB" actuel n'est pas une très bonne méthode. Cependant, certaines parties n'ont pas fait l'objet d'une enquête approfondie, donc si vous le connaissez, je vous serais reconnaissant de bien vouloir le compléter par des commentaires.
Comme alternative, il est préférable de préparer respectivement un script MATLAB et un script Python, et d'échanger des données avec des fichiers ou des entrées / sorties standard. Par exemple, si vous avez un script MATLAB principal (main.m) et un script Python (hogehoge.py) qui effectue le traitement, le traitement sera le suivant.
! Python hogehoge.py
Recommended Posts