Posts mit dem Label matlab werden angezeigt. Alle Posts anzeigen
Posts mit dem Label matlab werden angezeigt. Alle Posts anzeigen

Dienstag, 1. September 2009

Plot und Single? Nein.

Zum Merken: der Plot-Befehl in Matlab akzeptiert nur Variablen vom Typ Double. Bei Single bringt er einen Fehler, der allerdings nicht direkt damit in Verbindung gebracht wird.

Mittwoch, 26. August 2009

Project Euler.

Sehr coole Sache. Momentan 252 Aufgaben/Probleme, übergreifend mathematischer Art, die man programmierend lösen soll. (okay zum Teil gehts es auch mit Stift und Papier.)
Die Aufgaben sind so gestellt, dass am Ende immer eine Zahl rauskommt, die kann man (nach Anmeldung) beim jeweiligen Problem eingeben und wenn sie richtig ist bekommt man ein Häkchen und Zugang zum entsprechenden Forumthread. Dort findet man dann im Prinzip in jeder Programmiersprache eine Lösung, sehr interessant.
Die meisten Probleme kann man durch Brute-Force lösen, aber freiwillige Nebenbedingung ist, dass die Berechnung maximal 1 Minute dauern soll (das geht auch, man muss "nur" clever sein).
Kleines Beispiel, man hat ein Feld mit 20x20 Feldern und man soll die Anzahl der möglichen Wege über die Felderränder rausfinden, ein zulässiger Weg führt immer entweder nach rechts oder nach unten, nie zurück. Mein erster Ansatz rekursiver Natur hat das Ergebnis bis 10 Felder in akzeptabler Zeit gelöst, bei 20 Feldern hab ich nach 20 Minuten warten aufgegeben und neu überlegt. Und dann hab ich eine Formel gefunden mit der man die Anzahl berechnen kann... 10 Millisekunden.
Macht Spaß (wenn man den Spaß am Programmieren hat)!

Achso der Link.

Freitag, 27. Februar 2009

Array Indizierung: Matlab vs. C

Hat man ein zweidimensionales Array (Matrix) in Matlab, so wird dieses, wenn man eine mex-Funktion schreiben will, Spalte für Spalte durchgearbeitet. In normalen C-Code jedoch wird ein solches Array zeilenweise durchgearbeitet. Ist ganz nützlich zu wissen wenn man sich wundert warum der gleiche Code des mex-Files als DLL komische Dinge tut.

Ein wirklich guter Thread dazu im Mathworks Newsreader.

Sonntag, 8. Februar 2009

Schnell bessere PDFs aus MATLAB erzeugen.

Das MATLAB-Skript "print_pdf" von Oliver Woodford, das auf dem MATLAB File Exchange Server zu finden ist, erzeugt relativ problemlos PDFs aus MATLAB-Figures. Dabei behebt es auch das nervige Problem mit gestrichelten Plots. Ausprobieren lohnt sich.

Man muss allerdings Ghostscript installiert haben. Das Skript funktioniert sofort mit englischsprachigen Windows-Systemen, auf meinem deutschen XP musste ich den Pfad zu Ghostscript etwas anpassen. Im Skript selber ist die Stelle aber mit einem Kommentar verknüpft, der auch beschreibt wie man den Pfad anzugeben hat.

Montag, 29. Dezember 2008

Matlab Latex Export

http://www.mathworks.de/matlabcentral/fileexchange/4638
Nur für mich zum merken. Ich glaube das ist was ganz großes, muss ich testen.

Dienstag, 11. November 2008

Matlab Kurztipp: Figuregröße programmatisch festlegen

Möchte man die Größe einer Figure in Matlab festlegen, so lässt sich dies ganz einfach über den set-Befehl umsetzen. Am besten an einem kleinem Beispiel:
h = figure(1);
set(h,'Position',[200 200 640 480]);
Die Option Position ermöglicht es, festzulegen wo eine Figure auf dem Bildschirm dargestellt wird und wie groß sie sein soll. Die ersten beiden Werte im Vektor beinhalten die x- und y-Position der linken oberen Figure-Ecke, die beiden letzten geben die Breite und die Höhe der Figure an.
Jetzt ist dieser Befehl aber noch etwas schlauer:
h = figure(1);
set(h,'Units','normalized','Position',[0.2 0.2 0.5 0.5]);
Die Option Units lässt die Wahl zwischen:
  • normalized: relative Angaben
  • inches: Angaben in Zoll
  • centimeters: wer hätte es gedacht: in Centimetern
  • points: Angaben in Punkten (häufig für den Print-Bereich, siehe auch Wiki)
  • pixels: (standard) in Pixel
Damit erhält man eine ziemlich schöne Möglichkeit, Grafiken schon für den Export im Programm vorzubereiten ohne über den Export Setup... Menüpunkt zu arbeiten. Der set-Befehl hält hier nämlich auch alle anderen Optionen bereit, die man dort einstellen kann.

Wie lege ich zwei Bilder in Matlab transparent übereinander?

Da vor kurzem Bedarf bestand sowas zu bewerkstelligen, halte ich hier mal den Lösungweg dafür fest.
Zunächst einmal: Es gibt einen Befehl alpha(), damit kann man grundsätzlich alle Bilder/Patches oder sonstige flächigen Grafikteile einer Axis transparent machen. Das gilt aber wirklich für alle. Plote ich also zwei Bilder mit imagesc() oder image() übereinander:
bild = imread('test.png','png');
bild2 = imread('test2.png','png');
figure(1)
imagesc(bild)
hold on
imagesc(bild2)
hold off
alpha(0.5)
Das Ergebnis ist, dass man zwar beide Bilder übereinander liegen hat, aber halt beide zu 50 % durchsichtigt sind. Man möchte ja meistens lieber haben, dass das hintere Bild nicht durchsichtig ist. Dafür muss man nun Alphamaps verwenden.
Dabei handelt es sich um Matrizen, die genau so groß sind wie die zugehörigen Bilder. Sie enthalten werte zwischen 0 und 1, wobei 1 undurchsichtig ist (0 kann man sich denken).
Möchte ich jetzt beispielsweise, dass ein Bild 50 % durchsichtig ist, so erzeuge ich eine Matrix die nur 0.5 als Werte enthält. Ich schreibe jetzt einfach mal den Code und kommentiere Schlüsselstellen.
bild = imread('test.png','png');
bild2 = imread('test2.png','png');

figure(1)
imagesc(bild);

alpha_matrix = 0.5*ones(size(bild2,1),size(bild2,2)); %hier wird einfach nur eine %Matrix erzeigt die 0.5 als Werte hat
hold on
h = imagesc(bild2);
set(h,'AlphaData',alpha_matrix); % das ist der wichtigste Punkt, hier wird über den
%Set-Befehl die alpha_matrix mit dem Bild2 verbunden. h stellt den Handler (eine %Art Verweis) auf das geplottete Bild dar.
Mit diesem Code erhält man die gewünschte Darstellung. Der set-Befehl ist übrigens sehr, sehr mächtig. Viele Objekte in Matlab (z.B. Plots, Figures, Images, Optimierungsfunktionen(hier aber mit optimset)) lassen sich über einen Handler ansprechen und geben einem die Möglichkeit viele Dinge einzustellen. Mit set(h) als Eingabe in die Konsole erhält man alle verfügbaren Optionen, hier hilft natürlich die Hilfe.

Grundsätzlich sollte man noch beachten, dass jeder Plot (aber auch Line etc.) ein eigenes Objekt darstellt. Und das man diese auch in einer Figure gleichzeigt verwenden kann, so dass man beispielsweise Punkte in ein Bild ploten kann. Dabei aber immer an hold on denken ;)