====== Matlab ======
Matlab ist eine Mathematik-Software der Firma Mathworks
===== Dynamische Variablennamen =====
Um einen Wert einer Variable mit dynamischem Namen zuzuweisen:
eval(sprintf('%s = 3', 'bla'));
Auf die gleiche Weise kann auch eine symbolische Variable mit dynamischem Namen erstellt werden:
eval(sprintf('syms %s', 'bla'));
===== Private Methoden in Klassen mit externen Dateien =====
Möchte man nicht alle Methoden in der Datei mit der Klassendefinition (//klassenName//.m) haben, sondern auf mehrere aufteilen, kann man ein Verzeichnis @//klassenName// anlegen und darin Methoden //methodenName//.m anlegen.
Um die Zugriffskontrolle für die Methoden einzustellen, legt man @//klassenName/////klassenName//.m an und schreibt nur den Funktionsrumpf hinein.
Beispiel:
methods (Access = private)
a=methodenName(x);
end
===== Konstanten =====
Matlab bietet keine Möglichkeit Konstanten zu definieren, es gibt aber [[http://blogs.mathworks.com/loren/2006/09/13/constants/|Workarounds]]
===== Typ einer Variablen prüfen =====
Um den Typ einer Variablen anzeigen zu lassen, gibt es den Befehl
class(a)
Um zu prüfen, ob eine Variablen von einem definierten Typ ist gibt es z.B.
isa(x,'sym') %issymbolic(x) existiert nicht
ischar(x)
isfloat(x)
iscell(x)
===== mehrere Graphen in einem Plot =====
Um mehrere Plot in einer Grafik zusammenzufasssen kann man vorher "hold on" setzen. Beispiel:
hold on;
ezplot('x^2');
ezplot('x^3');
===== Farbe von Graphen setzen =====
Standardmäßig plottet MATLAB alle Graphen in blau, andere Farben werden mit "set" gesetzt. Beispiel:
g1 = ezplot('x^2');
set(g1, 'color', 'red');
Dem Befehl line kann die gewünschte Farbe auch direkt übergeben werden, ezplot unterstützt das nicht.
line ([-5, 5], [1, 1], 'color', 'red');
Sollen mehrere Plots in verschiedenen Farben geplottet werden, die nacheinander generiert werden, kann eine Colormap verwendet werden:
nrPlots = 5;
cc=jet(nrPlots);
figure;
hold on;
for i=1:nrPlots
plot([0 1],[0 i],'color',cc(i,:));
end
Statt jet kann auch eine andere Colormap wie hsv verwendet werden.
===== Schriftgröße der Achsenbeschriftung ändern =====
Die Schriftgröße der Achsenbeschriftung kann folgendermaßen vergrößert werden:
plot(rand(1,10))
set(gca,'FontSize',14);
===== alle Figures löschen =====
Geöffnete Figures/Plots werden mit close geschlossen:
close all;
===== Fehler beim Aufruf von Ghostscript aus MATLAB =====
Viele Matlab-Skripte zum Erzeugen von hochqualitiven Plots für Veröffentlichungen, wie z.B. [[http://www.mathworks.com/matlabcentral/fileexchange/23629-export-fig|export_fig]] (und andere) rufen [[Ghostscript]] direkt aus MATLAB auf. Dabei kann es zu folgendem Fehler kommen:
Error: /undefined in /findfont
Operand stack:
120 Helvetica ISOLatin1Encoding Helvetica Helvetica
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1916 1 3 %oparray_pop 1915 1 3 %oparray_pop --nostringval-- 1899 1 3 %oparray_pop 1787 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- 1868 5 5 %oparray_pop
Dictionary stack:
--dict:1180/1684(ro)(G)-- --dict:0/20(G)-- --dict:82/200(L)-- --dict:97/160(L)-- --dict:9/85(L)--
Current allocation mode is local
Current file position is 10662
GPL Ghostscript 9.07: Unrecoverable error, exit code 1
Das Problem ist, das MATLAB den LD_LIBRARY_PATH für seine Zwecke so verändert, das Ghostscript nicht mehr funktionsfähig ist. Vor dem Aufruf von Ghostscript muss LD_LIBRARY_PATH wieder geleert werden. Für export_fig muss in der Datei ghostscript.m die Zeile
system(sprintf('"%s" %s', gs_path, cmd));
durch
system(sprintf('export LD_LIBRARY_PATH=""; "%s" %s', gs_path, cmd));
ersetzt werden.
===== Ausgabe von fsolve =====
Nach der Ausführung von fsolve gibt die Funktion Informationen zur Lösung aus. Wenn das störend ist, kann die Ausgabe mit der Option "display off" unterdrückt werden:
fsolve(@f, x0, optimset('display', 'off'));
===== Lösung von Differentialgleichungen =====
* [[http://en.wikibooks.org/wiki/MATLAB_Programming/Ordinary_Differential_Equations|Infos zu den verschiedenen Lösern und dem von ihnen erwarteten Funktionsformat]]
===== Debugger hält nicht an Breakpoints =====
clear all;
clear functions;
löschen die zuvor gesetzten Breakpoints, so dass der Debugger dort nicht anhält. Einige Möglichkeiten, die beiden Befehle auszuführen ohne die Breakpoints zu löschen, werden [[http://stackoverflow.com/questions/2514911/how-to-clear-persistent-variables-while-keeping-breakpoints-in-matlab|hier]] beschrieben.
===== mehrzeilige Anweisungen =====
Da Matlab kein Semikolon als Ende einer Anweisung verlangt, müssen mehrzeilige Anweisungen mit "..." geschrieben werden:
if (bedingung1 || ...
bedingung2 || ...
bedingung3)
===== Element am Ende von Array einfügen =====
Die (für mich) logischste Schreibweise, ein Element am Ende eines Arrays einzufügen, ist diese:
a(end + 1) = newElement;
Außerdem gibt es noch diese Möglichkeiten:
a = [a newElement];
a = cat(2, a, newElement);
===== Nachträglich Einträge zu Legende hinzufügen =====
Matlab erlaubt es nicht, nachträglich Einträge zu einer Legende hinzuzufügen. Ein Workaround ist die Verwendung des undokumentierten Features "DynamicLegend" in Verbindung mit der Eigenschaft "DisplayName" der Plots:
x=0:.01:20;
plot(x, cos(x), 'DisplayName', 'cos (x)');
legend('-DynamicLegend');
hold on;
plot(x, sin(x), 'DisplayName', 'sin (x)');
Die zugewiesenen DisplayNames lassen sich auch im Property Editor von Matlab anzeigen.
===== Keine LaTeX-Interpretation (z.B. Tiefstellung) in Plotbeschriftung =====
Standardmäßig verwendet MATLAB einige [[LaTeX]]-ähnliche Befehle zur Textformatierung, z.B. den Unterstrich "_" zum Tiefstellen. Möchte man dies nicht, kann dies für einzelne Elemente oder global deaktivieren.
Für einzelne Titel:
title(text, 'interpreter', 'none')
Für einzelne Legenden (Einträge als Cell Array):
legend({'text_1', 'text_2'}, 'Interpreter', 'none');
Für einzelne Legenden (mehrere Strings als Einträge):
l = legend('text_1', 'text_2');
set(l, 'Interpreter', 'none')
Global:
set(0, 'DefaulttextInterpreter', 'none')
===== Animationen erstellen =====
Einzelbilder,die zu Animationen zusammengebaut werden sollen, werden wie gewöhnlich geplottet und dann mit getframe() in einem Array abgelegt. Mit movie lassen sich dann die Einzelbilder als Film abspielen. Ohne Argumente aufgerufen, erfasst getframe keine Titel oder Achsenbeschriftungen. Möchte man diese in der Animation sehen, müssen getframe **und** movie mit gcf bzw. einem anderen Figurehandle aufgerufen werden.
clear;
[X Y] = meshgrid(-2:2, -2:2);
for j = 1:10
surf(X, Y, X.^2+j);
zlim([0 20]);
title(['j = ' num2str(j)]);
F(j) = getframe(gcf);
end
movie(gcf, F, 20);
===== Lizenzen =====
Die augenblicklich ausgecheckten Lizenzen lassen sich durch den Befehl
license('inuse')
anzeigen.
===== Maximum einer Matrix =====
Der Maximalwert einer Matrix lässt sich am einfachsten mit
max(a(:))
finden.
===== Aktuelles Datum anzeigen =====
Das aktuelle Datum mit Uhrzeit lässt sich am einfachsten mit
datestr(now);
anzeigen lassen.
===== Zuweisen von Defaultwerten in Properties von Klassen =====
Defaultwerte für Properties von Klassen (=Membervariablen) lassen sich entweder in den Properties direkt setzen oder beim Aufruf des Konstruktors.
Beispiel mit Zuweisung direkt in den Properties:
classdef MyClass
properties
PropertyOne = 42;
PropertyTwo = MyClass2();
end
end
Dabei wird die rechte Seite nur beim ersten Instanzieren der Klasse MyClass ausgewertet. Der Konstruktor von MyClass2 wird deshalb nur //einmal// ausgeführt. PropertyTwo enthält daher immer das gleiche Objekt, siehe
[[https://de.mathworks.com/help/matlab/matlab_oop/initialize-property-values.html#brqy3km-10|Defining Default Values]]
Beispiel mit Zuweisung beim Aufruf des Konstruktors:
classdef MyClass
properties
PropertyOne
PropertyTwo;
end
methods
function obj = MyClass()
obj.PropertyOne = 42;
obj.PropertyTwo = MyClass2();
end
end
end
Auf diese Art wird bei jeder Instanzierung von MyClass eine Auswertung der rechten Seiten vorgenommen. Der Konstruktor von MyClass2 wird daher //mehrmals// ausgeführt, siehe
[[https://de.mathworks.com/help/matlab/matlab_oop/initialize-property-values.html#brqy3km-11|Set Property Values in the Constructor]]
===== MATLAB-Skript von der Kommandozeile starten =====
Um ein MATLAB-Skript ohne grafische Ausgabe zu starten, kann folgender Befehl verwendet werden:
matlab -nosplash -nodisplay -nodesktop -r scriptToStart
===== Links =====
* [[http://www.mathworks.de/products/matlab/|Matlab Homepage]]
* [[http://undocumentedmatlab.com/|Sammlung von undokumentierten Matlab-Funktionen]]
* [[http://ubcmatlabguide.github.io/|Yet another guide to Matlab, u.a. mit Tipps zur Beschleunigung]]
* [[https://github.com/tminka/lightspeed|Lightspeed Bibliothek von Tom Minka]]
* [[http://en.wikibooks.org/wiki/MATLAB_Programming/Struct_Arrays|Hinweise zu Structs]]
* [[http://en.wikibooks.org/wiki/MATLAB_Programming/Error_Messages|Häufige MATLAB-Fehlermeldungen und ihre Ursachen]]
* [[http://stackoverflow.com/a/1745686|Matlab OOP Performance (mit Benchmark Code)]]
* [[http://www.henning-thielemann.de/ScriptingHater.html|Scriptsprachen-Hassen leichtgemacht]] (insbesondere MATLAB)
* [[https://abandonmatlab.wordpress.com/|Abandon MATLAB]]