MATLAB und Python haben jeweils ihre Vorteile. MATLAB ist stark in Matrixoperationen und seine Stärken umfassen japanische Dokumente und die Existenz von Simlink. Auf der anderen Seite ist Python kostenlos zu verwenden und seine umfangreichen Bibliotheken für maschinelles Lernen wie Scicit-Learn sind attraktiv. Daher möchten Sie diese möglicherweise ordnungsgemäß verwenden.
In einem solchen Fall gibt es Möglichkeit, Python direkt von MATLAB aus aufzurufen. (Im Gegenteil, Sie können auch die MATLAB-Funktion von Python aus aufrufen, aber ich werde sie diesmal nicht berühren.)
Selbst wenn ich es nachschlage, ist das offizielle Dokument nicht sehr praktisch [^ Beispiel]. Daher werde ich dieses Mal ** Informationen organisieren und zusammenfassen, die im praktischen Gebrauch nützlich zu sein scheinen **.
In der Vergangenheit gab es Zeiten, in denen ich den Teil des maschinellen Lernens mit Python verarbeiten und MATLAB verwenden wollte, um Trainingsdaten vorzubereiten und das Modell zu bewerten. Sie konnten den Code in jeder Sprache schreiben und ausführen und die Ergebnisse in einer Dat- oder Mat-Datei austauschen, aber es war ein wenig mühsam. Als ich von dieser Funktion erfuhr, dachte ich: "Ich kann es einfacher machen!" (Eigentlich war die Schlussfolgerung, die ich mir ansah, "** Python-Aufrufe von MATLAB sind nicht wünschenswert **")
[^ Beispiel]: Es gibt nur ein Beispiel für textwrap.wrap, und ich habe keine Ahnung, wie man numpy usw. verwendet. (Ich glaube, ich wollte es nur mit der Standardbibliothek erklären.)
Bevor Sie es mit MATLAB verwenden können, müssen Sie den Python-Interpreter installieren und seinen Pfad registrieren. Da Python jedoch Offizielle Version und Anaconda-Version hat, ändert sich das Verfahren ein wenig. Ich werde.
Um die offizielle Version von Python.org zu verwenden, installieren Sie sie gemäß Erläuterung hier. nur.
Wenn der Pfad jedoch nicht in der Anaconda-Umgebung oder in der offiziellen Version übergeben wird, muss der Pfad in MATLAB einzeln festgelegt werden.
Ermitteln Sie zunächst den Pfad des Interpreters, den Sie verwenden möchten.
Legen Sie dann den Pfad fest, der von der Funktion [pyversion
] überprüft wird (https://jp.mathworks.com/help/matlab/ref/pyversion.html).
Um beispielsweise Anacondas "Hogehoge" -Umgebung zu verwenden, schreiben Sie wie folgt.
executable = [getenv('userprofile'),...
'\AppData\Local\Continuum\anaconda3\envs\hogehoge\python.exe'];
pyversion(executable);
clearvars executable;
Führen Sie "pyversion" ohne Argumente aus, um festzustellen, ob es ordnungsgemäß eingerichtet ist. Wenn die Version angezeigt wird, sollte dies in Ordnung sein.
Rufen wir als nächstes eine Python-Funktion auf. Um eine Funktion namens "command" in Python von MATLAB aus aufzurufen, verwenden Sie einfach "py.command". Wenn Sie beispielsweise die Python-Druckfunktion ausführen möchten, gehen Sie wie folgt vor.
py.print("Hello world!");
Es ist jedoch zu beachten, dass MATLAB und Python unterschiedliche integrierte Datentypen und Syntax haben. Selbst wenn dies beispielsweise in Python möglich ist, ist die folgende Notation nicht zulässig.
py.print("{0} {1}".format("Hello", "world!"));
% py.print("{0} {1}".format("Hello", "world!"));
% ↑
%Error:Unerwarteter MATLAB-Operator.
Zur ordnungsgemäßen Ausführung [Konvertieren Sie den String-Typ von MATLAB explizit in den String-Typ von Python](https://jp.mathworks.com/help/matlab/matlab_external/handling-data-returned-from- python.html) Sie müssen es tun.
py.print(py.str("{0} {1}").format("Hello", "world!"));
Weiter zum Thema So importieren Sie Python-Pakete. Die obige Seite beschreibt das Syntaxäquivalent von "from x import y" in Python. In der Praxis wird jedoch häufig eine Syntax wie "import numpy as np" verwendet. Dies kann wie folgt aus [Implementierung der Importanweisung] auf der Python-Seite (https://docs.python.org/ja/3/library/importlib.html) geschrieben werden.
%Code, der dem Import von numpy als np in Python entspricht
np = py.importlib.import_module('numpy');
Die Datentypkonvertierung erfolgt beim Datenaustausch zwischen MATLAB und Python. Die automatische Konvertierung lautet MATLAB zu Python, [Python zu MATLAB](https: // Es ist in jp.mathworks.com/help/matlab/matlab_external/handling-data-returned-from-python.html#buialof-53) organisiert. Wenn Sie hier einen 1-mal-N-Vektor an Python übergeben, wird dieser automatisch in den integrierten Array-Typ konvertiert. Die M-mal-N-Matrix scheint jedoch nicht automatisch konvertiert zu werden.
matrix = np.array(rand(2));
%Error: py.builtin_function_or_method/subsref
% MATLAB 'double'Die Konvertierung in Python ist 1-Wird nur für N Vektoren unterstützt.
Daher scheint es, dass es in die ndarray-Form konvertiert werden kann, indem die folgenden Schritte ausgeführt werden, indem das Matlab-Zellenarray automatisch in Python-Taple konvertiert wird.
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); %Originalmatrix(MATLAB)
py.print(matrix); %Matrix nach der Konvertierung(ndarray)
Es ist mühsam, jedes Mal eine for-Anweisung zu schreiben, daher ist es besser, sie als Funktion zu verwenden.
mat2ndarray.m
function ndarray = mat2ndarray(mat)
% ndarray = mat2ndarray(mat)Konvertieren Sie die Matrix in das Python-ndarray-Format und kehren Sie zurück
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
In Python kann Geben Sie den Parameternamen an und übergeben Sie ihn an die Funktion auftreten. In diesem Fall besteht das Problem darin, dass die Syntax zwischen MATLAB und Python unterschiedlich ist. Verwenden Sie als Lösung die [pyargs-Funktion] von MATLAB (https://jp.mathworks.com/help/matlab/ref/pyargs.html).
Um beispielsweise den Durchschnitt für jede Spalte einer Matrix mit numpy zu berechnen, gehen Sie wie folgt vor.
mat = mat2ndarray(rand(2));
%Np in Python.average(a=mat, axix=0)Gleichwertig
ave = np.average(pyargs('a', mat, 'axis', py.int(0)));
Hierbei ist zu beachten, dass MATLAB Zahlen grundsätzlich als Doppeltypen behandelt.
Wenn die Verarbeitung in Python abgeschlossen ist, kehren Sie zum Grundtyp von MATLAB zurück und zeichnen ihn. In diesem Fall ist eine Konvertierung in eine MATLAB-Matrix erforderlich, die jedoch nicht einfach wie unten gezeigt konvertiert werden kann.
n_mat = np.average(pyargs('a', mat2ndarray(rand(2)), 'axis', py.int(0))); %Einige Verarbeitungsergebnisse
double(n_mat); %Ich möchte in eine Matlab-Matrix konvertieren
%Error: double
% py.numpy.Konvertierung von ndarray in double nicht möglich.
Daher muss es konvertiert werden sowie [Wie man eine Matrix übergibt](# Wie man eine Matrix übergibt (MATLAB an ndarray)). Verwenden Sie daher nach der Konvertierung in einen Vektor vom Typ "array.array" die Informationen in "ndarray.shape" in Funktion umformen. Formen Sie es mit HTML). Insbesondere kann es mit der folgenden Funktion [^ refdiscussion] konvertiert werden.
function mat = ndarray2mat(ndarray)
% mat = narray2mat(mat)Konvertiert die Python-Narray-Formatmatrix in die MATLAB-Formatmatrix und gibt sie zurück
validateattributes(ndarray, {'py.numpy.ndarray'}, {'scalar'});
np = py.importlib.import_module('numpy');
shape = cell(ndarray.shape); %Lesen Sie die Form
shape = cellfun(@(x) int64(x), shape); % py.Konvertiere int in int64
if shape == 1
%Vermeiden Sie bei Skalaren Fehler
shape = [1, 1];
end
%Daten als Vektor lesen
data = py.array.array(ndarray.dtype.char, np.nditer(ndarray));
data = double(data); % py.array.Array in double konvertieren
mat = reshape(data, shape); %Ordnen Sie die Form in einer Matrix an
end
[^ refdiscussion]: Ich habe auf [diese Diskussion] verwiesen (https://jp.mathworks.com/matlabcentral/answers/157347-convert-python-numpy-array-to-double).
Lassen Sie uns das Ergebnis mit matplotlib anzeigen, ohne auf das Plot-Tool von MATLAB [^ matplotlib] angewiesen zu sein. In meiner Umgebung (Anaconda) konnte ich jedoch aufgrund eines Qt-bezogenen Fehlers nicht zeichnen.
Als ich Umgebungsvariablen unter Bezugnahme auf diesen Artikel hinzufügte, konnte ich gut zeichnen. Unten finden Sie den Code zum Hinzufügen des Qt-Pfads für die Hogehoge-Umgebung.
QtPath = [getenv('userprofile'),...
'\AppData\Local\Continuum\anaconda3\envs\hogehoge\Library\plugins'];
setenv('QT_PLUGIN_PATH', [getenv('QT_PLUGIN_PATH'), QtPath]);
clearvars QtPath;
Wenn ich diesen Code in "startup.m" setze, könnte ich ihn richtig zeichnen.
[^ matplotlib]: Es ist seltsam, matplotlib, das MATLAB-ähnliche Diagrammzeichnungen bietet, auf MATLAB zu verwenden ...
Ich bin jedoch der Meinung, dass matplotlib für das Standardfarbschema besser ist.
Wenn Sie Python verwenden, möchten Sie scicit-learn oder seaborn verwenden. Es scheint jedoch, dass diese aus irgendeinem Grund nicht importiert werden können.
%Ich kann nicht einmal die Hilfe sehen ...
py.help('seaborn')
% problem in seaborn - ImportError: DLL load failed:Die angegebene Prozedur kann nicht gefunden werden.
Wenn jemand die Ursache oder Lösung kennt, lassen Sie es mich bitte wissen ...
Das Obige ist die Methode zur Verwendung von Python von MATLAB in dem von mir untersuchten Bereich. Zusammenfassend dachte ich, es wäre überwältigend einfacher, ** einzeln auszuführen und die Dateien zu übergeben **. Ich denke, es ist oft einfacher, einen Prozess zum Übergeben einer CSV-Datei mithilfe einer Bibliothek zu schreiben, als zu lernen, wie man Python von MATLAB aus aufruft.
<! - Wenn Sie den Prozess zum Übertragen von Dateien festlegen, ist die Übertragung in andere Sprachen reibungslos. ->
Außerdem ist es in meiner Umgebung fatal, dass ** Scikit-Learn nicht verwendet werden kann **. Wenn es sich nur um Numpy- und Scipy-Funktionen handelt, sind die integrierten Funktionen von MATLAB meiner Meinung nach leistungsfähiger.
Darüber hinaus bieten Spyder und Pycharm Unterstützung wie eine starke Code-Vervollständigung, MATLAB bietet jedoch eine schlechte Unterstützung.
In Anbetracht dessen ist der aktuelle "Python-Aufruf von MATLAB" keine sehr gute Methode. Es gibt jedoch einige Teile, die noch nicht vollständig untersucht wurden. Wenn Sie damit vertraut sind, würde ich es begrüßen, wenn Sie es mit Kommentaren ergänzen könnten.
Alternativ ist es besser, ein MATLAB-Skript bzw. ein Python-Skript vorzubereiten und Daten mit Dateien oder Standardeingaben / -ausgaben auszutauschen. Wenn Sie beispielsweise ein MATLAB-Hauptskript (main.m) und ein Python-Skript (hogehoge.py) haben, die die Verarbeitung ausführen, sieht die Verarbeitung wie folgt aus.
! Python hogehoge.py
ausRecommended Posts