Während des Studiums der mathematisch-technischen Studiengänge an unserer Universität kommt man um ein Programm selten herum: Matlab. Der rechnerische (fast-)Alleskönner ist aus vielen Vorlesungen und insbesondere aus den Übungsbetrieben nicht wegzudenken. Grundvorlesungen wie Numerik 1, Optimierung oder Bild- und Signalverarbeitung, aber auch viele Mastervorlesungen wie Neuroinformatik oder Computer Vision, verlangen meist auf jedem Übungsblatt die Abgabe von Matlab-Programmen oder bauen den Übungsbetrieb komplett auf der Programmierung von Matlab-Algorithmen auf. Doch auch außerhalb des Vorlesungsbetriebes ist Matlab beliebt, sei es bei Projekten oder bei Praktika, die in Richtung Signalverarbeitung gehen. Einer der größten Vorteile Matlabs ist die Vielfalt der Signalarten, mit denen gearbeitet werden kann. Matlab beherrscht sowohl die Verarbeitung von Bildern, Tönen, Funktionen als auch räumlichen Gebilden und ist daher in sämtlichen der oben genannten Fachbereichen sehr beliebt. Zunächst steht man jedoch vor einem großen Problem: Was nützen einem die Funktionen, die Matlab beherrscht, wenn man Matlab selbst nicht beherrscht? Die Einführung in das Programm ist an unserer Uni denkbar schlecht gelungen. Es gibt keine richtige Einführungsveranstaltung. Notgedrungen werden in den früheren Fächern, in denen das Programm benötigt wird, kurze, aber meist wenig zweckdienliche Einweisungen gegeben. Derer gibt es dafür aber umso mehr – einmal in jedem Modul. So wird man kaum richtig warm mit der Programmiersprache, die Matlab nutzt, denn der Wechsel von ständig wiederholter Einführung zur Erwartung, komplexere Algorithmen programmieren zu müssen, geht sehr schnell und abrupt. Das Ergebnis: Es wird sich an den Prinzipien anderer Programmiersprachen irgendwie durchgehangelt – zum Leide der Korrekteure und der Studenten selbst.

Selbst die Frage nach dem Warum kann Matlab treffend beantworten.

Selbst die Frage nach dem Warum kann Matlab treffend beantworten.[media-credit id=51 align="aligncenter" width="640"]

Dabei bietet Matlab, wenn man einmal die Wirkungs- und „Denkweise“ des Programmes begriffen hat, sehr mächtige und effiziente Möglichkeiten. Die größte Stärke von Matlab ist die vektorielle Arbeitsstruktur. Vektoren, Matrizen und Arrays, gefüllt mit den verschiedensten Datentypen (zum Beispiel ganzen Zahlen, Kommazahlen, Buchstaben oder sogar noch komplexeren Typen), sind das A und O bei der Programmierung mit Matlab. Viele Operationen lassen sich gemeinsam auf alle Einträge einer Matrix oder eines Vektors anwenden. Die aus der üblichen Programmierung bekannten for-Schleifen werden dank dieser Rechenweise kaum benötigt. Es gibt sie zwar dennoch, sie werden auch allzu gerne von Studenten genutzt, doch sie sind im Vergleich zur vektoriellen Rechnung um einiges weniger effizient.

Ein kleines einfaches Beispiel: X ist ein Vektor mit 10.000 Einträgen (hier gefüllt mit Zufallszahlen zwischen 0 und 1). In solchen und viel höheren Dimensionen wird in der Realität häufig gearbeitet. Wir entscheiden uns, dass wir lieber Zufallszahlen zwischen -0.5 und 0.5 haben wollen. Eine Möglichkeit, dies zu realisieren ist, jeder Zufallszahl den Wert 0.5 abzuziehen. Mit einer simplen for-Schleife sieht das Ganze so aus:

for i=1:10000

X(i)=X(i)-0.5;

end;

Matlab kann das Ganze aber effizienter berechnen. Addiert oder subtrahiert man nämlich eine Zahl zu einem Vektor oder einer Matrix hinzu, so tut Matlab dies elementweise, also addiert bzw. subtrahiert diese Zahl an jedes einzelne Element der Matrix. Als Code ist es folgender Einzeiler:

X=X-0.5;

Man beachte die fehlende Angabe eines Index i. Das ist gewollt, da so mit ganz X und nicht mit einem Element von X gearbeitet wird. Die Zeitauswertung der beiden Versuche liefert eine Rechendauer im Rahmen <math>10^{-4}</math> für die erste und <math>10^{-5}</math> für die zweite Version. Es mögen beide sehr gering sein; sie unterscheiden sich aber schon bei einer Größe von <math>10^{5}</math> Werten in X um den Faktor 10. Erhöht man die Größe von X auf 10 Millionen Werte, benötigen wir ca. 10 Sekunden für die Version mit for-Schleife und ca. 0.01 Sekunden für den Vektorbefehl. Ein Unterschied um den Faktor 1000.

Eine Rechendauer von 10 Sekunden ist für eine reine Subtraktion offensichtlich unsinnig viel. Dieses leichte Beispiel zeigt, welchen gewaltigen Unterschied es machen kann, mit den Matlab-gedachten Methoden anstatt mit den altbekannten zu arbeiten. Deshalb ist es schon am Anfang lohnend, sich mit der vektoriellen Methodik Matlabs auseinanderzusetzen. Auch wenn es für die Übungszettel im dritten oder vierten Semester kaum einen Unterschied macht, nützt einem das Wissen bei größeren Projekten umso mehr.

Neben der einfachen Addition kennt Matlab einige andere grundlegende Rechenbefehle, die elementweise durchgeführt werden. Sämtliche skalaren Werte können addiert, subtrahiert, multipliziert und dividiert werden. Sogar das Potenzieren ist elementweise machbar. Da der übliche “^“-Befehl jedoch bereits für die Matrixpotenz reserviert ist, muss ein Punkt hinzugefügt werden. Will man zum Beispiel alle Quadrate der Zahlen 1 bis 5 verwenden, so lautet der einfache Befehl

Y=(1:5).^2

und gibt die korrekte Ausgabe

Y = 1 4 9 16 25

Bei der Multiplikation dürfen die normalen Operatoren * bzw. / nicht mit den Operatoren .* beziehungsweise ./ verwechselt werden! Erstere sind nämlich für die Matrizenmultiplikation bzw. die Multiplikation mit der Inversen der Matrix reserviert. Letztere Befehle gibt es ebenfalls. Sie haben aber eine andere, wenn auch nicht weniger praktische Bedeutung. Mit ihnen kann man zwei gleich große Matrizen A und B elementweise multiplizieren oder dividieren – etwas das häufig notwendig ist und gerne auch mit for-Schleifen realisiert wird. Die elementweise Addition zweier Matrizen funktioniert über den einfachen Operator “+“.

Eine Übersicht über die Matlab-Operatoren.

Eine Übersicht über die Matlab-Operatoren.[media-credit id=51 align="aligncenter" width="640"]

Die verschiedenen Operatoren für die einfachen arithmetischen Rechnungen können zum Anfang verwirrend sein. Wann soll welche Multiplikation durchgeführt werden? Will man die Werte wirklich quadrieren oder doch die Matrix mit sich selbst multiplizieren? Um die Übersicht nicht zu verlieren, gibt es hier eine Tabelle, die helfen soll.

Die richtige Wahl des Operators ist dabei wichtig und beeinflusst nicht nur die Korrektheit der Berechnung, auch kann man mit dem richtigen Operator ineffiziente for-Schleifen umgehen, falls diese nur für elementweise Berechnungen genutzt werden. Es gibt natürlich viele andere Situationen, in denen for-Schleifen nicht vermieden werden können. Wo es aber machbar ist und nicht zu sehr zu Lasten der Lesbarkeit fällt, sollten sie so wenig wie möglich verwendet werden.

In der nächsten Ausgabe unserer Zeitung gibt es ein paar Tipps zum Datentyp Boolean und wie man mit diesem if-Abfragen als Matrix-Vektor-Operationen effizienter programmieren kann.

Noch keine Kommentare, sei der Erste!