Allgemein

Matlab ist wie Python eine Programmiersprache, die über einen Interpreter ausgeführt wird, der zuvor auf dem System installiert sein muss. Dadurch müssen Programme nicht direkt auf die vorliegende Begebenheiten der Maschine compiliert werden, sind aber auch nicht ohne Interpreter lauffähig.

Bei Interpretern gibt es mehre Implementierungsstrategien, wie diese letztlich Maschinenanweisungen ableiten. Für den Anwender ermöglicht eine solche Lösung die Illusion, der Rechner würde diesen Code zeilen bzw. blockweise zur Laufzeit ausführen.

Jede Zeile endet mit einem Simikolon, es sei denn, das Ergebnis soll direkt im Command Window ausgegeben werden. Längerer Code kann mit … am Ende der Zeile auf die nächste Zeile erweitert werden. Kommentare werden mit einem % angekündigt. Es spielt keine Rolle, wie der Code eingerückt ist, dient aber natürlich (wie in allen Sprachen) der Übersichtlichkeit.
In der Regel löscht man zum Beginn den Workspace mit

 clear all %löscht alle Variablen 

Schleifen werden von der Syntax wie folgt geschrieben

 for i=1:10 % durchlaufe die folgende Anweisung von 1 bis 10, und erhöhe in jedem Durchlauf den i um 1
output=i^2
end

Abfragen werden wie folgt definiert.

 if output == 100 % Alternativ steht ~= für ungleich und >, >= usw.
% Für den Vergleichen von Wörtern sollte jedoch die Funktion strcpm verwendet werden,
% bei dem Wörter auch verschieden lange sein können.
Antwort='Volltreffer'
elseif output == 81
Antwort='knapp daneben'
elseif output == 121 Antwort='knapp drüber'
else
Antwort='daneben'
end

Der Code kann mit %% am Anfang einer Zeile in Sektionen unterteilt werden. So kann der Code abschnittsweise per „Strg + Enter“ ausgeführt werden.
Matlab ist vom Ursprung in den 1970er als Sprache für effiziente Matrizenoperationen konzipiert. Diese Operationen verwenden Ingenieure und Wissenschaftler häufig für numerische Berechnungen. Alle numerischen Werte werden in Matlab deshalb als Matrizen aufgefasst, auch wenn es im einfachsten Fall eine 1×1 Matrix ist.
Ein Reihenvektor, bzw. Einträge in der Horizontalen, erfolgen durch Leerzeichen oder Komma-Trennung.

 x=[1,2,3,4,5];

Ein Spaltenvektor, bzw. Einträge in der Vertikalen, hingegen durch Simikolon-Trennung.

 y=[1;4;9;16;25];

Kombiniert lassen sich so Matrizen definieren:

 data=[1 2 3 4 5;...
1 4 6 16 25];

Spalten und Reihen lassen sich durch einen Transponierungsbefehl, einem folgenden Hochkomma, austauschen.

 dataT=data';

Einträge in einer Matrix lassen sich gezielt ansprechen und jederzeit ändern. Durch Klammern werden einzelne Bereiche einer vorhandenen Matrix angesprochen.

 data(1,6)=[6];
data(2,6)=[36];

Dabei wird immer erst die Reihe und dann die Spalte angesprochen. Das kann man sich durch eine einfache Eselsbrücke merken. Das R für Reihe steht im Alphabet vor S für Spalte. Mit dem Doppelpunkt (von : bis) lassen sich ganze Bereiche ansprechen. Den letzten Wert kann man einfach mehr end ansprechen. Die letzten drei Werte der zweiten Spalte lässt bzw. so ansprechen.

 werte=data(2,3:end-2);

Der Doppelpunkt alleine steht ohne weitere Angabe für alle Werte in eine Reihe bzw. Spalte

 ersteSpalte=data(:,1);

Nicht numerische oder gemischte Daten lassen sich in Cell Strukturen speichern. In diesem Fall werden statt den eckigen Klammern […] die geschweiften Klammern {…} verwendet.

 xCell={1,2,'drei','4','5'};

Oftmals müssen solche Daten zunächst konvertiert werden, wobei Matlab zahlreiche Konvertierungsfunktionen anbietet. Die numerische Addition eines ersten und letzten Eintrag funktioniert z.B. wie folgt

 xCell{1} + str2num(x_cell{end});

Die Zeichenaddition hingegen

 [num2str(x_cell{1}) x_cell{end}];

Strigent aber zunächst häufig verwirrend ist, dass auch einzelne Zeichen (in der Regel Buchstaben) in einem Array gespeichert werden, weshalb, wie in dem obigen Beispiel gezeigt, beim Zusammenfügen von Strings ebenfalls mit Leerzeichen getrennte […] Klammern verwendet werden.

Matlab erkennt in den meisten Fällen den Unterschied von ganzen Zahlen (vom Typ Integer) und reellen  Zahlen (vom Typ Double) automatisch. Weiterhin werden die Variablen bei der ersten Verwendung automatisch angelegt und müssen nicht vorab definiert werden. Die Größe der Matrix kann dynamisch verändert werden.

Ein Löschen erfolgt mit

 werte[1]=[] 

Einen Wert ergänzen lässt sich mit

 werte(end+1)=1 

Das ist im Vergleich zu anderen Programmiersprachen vergleichsweise komfortabel, wenn auch nicht ganz so schnell. Wenn es geht, sollte diese Taktik möglichst vermieden werden.
Sowohl Cells als auch Arrays lassen sich in Strukuren zusammenfassen, die wie Container für verschiedene Daten gesehen werden können.

 container.x=[1 2 3 4 5]';
container.y=[1 4 6 16 25]';
container.info='Quadratdaten';

Die Daten können mit der table Funktion auch in einer Tabelle gespeichert werden

 tabelle=table([1 2 3 4 5]',[1 4 9 16 25]','VariableNames',{'x';'y'});

oder in einem Datastore für eine lokale, aber für den Arbeitsspeicher zu große Datenmenge. Z:B in einer Exeldatei.

 xlswrite('Quadratdaten.xlsx',{'x','y'; 1,2 ; 2,4 ; 3,9 ; 4,16 ; 5,25})
ds=datastore('Quadratdaten.xlsx')
preview(ds)

aus dem die Daten dann gestreamt werden können

Matlab kann auch direkt mit einer relationalen SQL Datenbank kommunizieren

conn = database('dbtoolboxdemo','','');
datainsert(conn,{'x','y'},colnames,[x,y])
close(conn)

Die Idee einer Interpretersprache ist, Programmcode als von Menschen lesbaren Text abzuspeichern, die erst bei Ausführung in Maschinencode compiliert werden, anstatt ein Programm vorab zu compilieren. So kann Programmcode automatisch Programmcode generieren, der wiederum Programmcode generieren kann usw.
Das Programm ist auf diese Weise nicht starr und reagiert auf Änderungen. In Matlab könnte ein Script, das eine Funktion erstellt, beispielsweise so aussehen, indem die Funktion hart Zeile für Zeile geschrieben wird.

 % Definitionen
ModellName='Quadratmodell';
VariablenName='xq';
ParameterName='a2';
ParameterWert = 1;

%Erstellung der Topologie
Topologie=[ParameterName '.*' VariablenName '.^2'];
% f=a2*y^2 --> f = |a2| |*| |y| |^2|

%Modell Speicherung als Script
fileID = fopen([ModellName '.m'],'w');
fprintf(fileID,['function [yp] = ' ModellName '(' VariablenName ') \n']);
fprintf(fileID,[' ' ParameterName ' = ' num2str(ParameterWert) '; \n']);
fprintf(fileID,[' yp = ' Topologie ' ; \n']);
fprintf(fileID,'end');
fclose(fileID);

Dieses Script erstellte soeben folgende Datei:

 open('Quadratmodell.m')

Diese Datei kann im weiteren Ausführen des Scriptes als Funktion aufgerufen und somit direkt im weiteren Programmablauf verwendet werden, ohne das gesamte Programm zunächst erneut in Maschinencode zu compilieren. Das scheint vielleicht umständlich, doch wie wir noch sehen werden, stellt Matlab auf diesem Weg ein angelerntes Neuronales Netz dem Anwender zur Verfügung.

 % Modellaufruf
y=Quadratmodell([1;2;3;4;5]);

Diese Vorgehen ist allerdings nicht besonders transparent. In andere Sprachen lassen sich Funktionen besser handhaben. Eine Refaktorisierung ist in Matlab recht umständlich.

In einfachen Fällen kann man mathematische Funktionen über eine interne Matlabfunktion der Symbolik Math  Toolbox direkt schreiben. Hierzu muss man aber zunächst explizit die verwendeten Variablen als symbolischen Typ deklarieren.

 syms x a2
y=matlabFunction(a2*x^2,'File','Quadratmodell2','Vars',{a2, x});

Funktionen können auch als matlabinternes Function Handle gespeichert werden.

 y_h=matlabFunction(a2*x^2,'Vars',{a2, x})
y_h(1,[1:5]);

Functions Handles sind ein mächtiges Werkzeug. Mit ihnen ist es ermöglichen, nicht nur Matrizen an Funktionen zu übergeben, sondern auch Funktionen selbst zu übergeben. So kann z.B. eine Optimierungsfunktion aufgerufen werden, an die die zu optimierende Funktion übergeben wird, dessen optimaler Parameter bestimmt werden soll.

 p0=0; %Startwert für die Suche nach dem Parameter a2
xdata=[1 2 3 4 5];
ydata=[1 4 9 16 25];

a2_opt = lsqcurvefit(y_h,p0,xdata,ydata)
y_h(a2_opt,[1:5]);

Für die Funktion lsqcurvefit ist zu beachten, dass in der zu optimierenden Funktion in der Reihenfolge zunächst die Parameter und dann erst die x-Werte übergeben werden.
Modernere und deutlich schnellere Interpretersprachen wie node.js oder Julia behandeln Funktionen und Variablen gleichermaßen. Seit kurzem ist es allerdings auch in Matlab möglich, Funktionen on-the-fly in Skripten zu definieren, ohne den Umweg über das Anlagen neuer Dateien. Das ist aber leider nicht konsequent umgesetzt, da sie stets am Ende des files stehen müssen, aber immerhin.


y=quadrieren(5)

% ...

% Ende des Scripts

function [y] = quadrieren(x)
a2 = 1;
y = a2.*x.^2 ;
end

Verschachtelte Funktionen sind mit der selben Einschränkung möglich.


y=quadrieren(5)
function [y] = quadrieren(x)
a1 = 1;
a2 = a1PlusWert(1);
y = a2.*x.^2 + a1;

function [a2] = a1PlusWert(Zahl)
a2=a1+Zahl; % man beachte, dass diese nested-function auf die Varialbe a1
% der übergeordneten Funktion zugreifen kann, und sie somit
% nicht übergeben werden muss a1PlusWert(Zahl,a1) ...
end
isZahlExisting = exist('Zahl') % ... das funktioniert jedoch nicht umgekehrt
end

Alle Funktionen, die Matlab mitbringt – und das sind viele – , sind jederzeit direkt verwendbar. Im Hintergrund initialisiert Matlab beim Start eine lange Liste, über dessen Abgleich dann das jeweils entsprechende *.m file in einem Unterordner aufgerufen wird. Eigens erstellte *.m files (wie das oben geschriebene Quadramodell.m) sucht Matlab stets im aktuellen Arbeitsordner des Dateisystems.

 

Matlab Basics
Bewerte den Beitrag

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.