Von C nach MATLAB Einführung in MATLAB für Personen mit C-Kenntnissen Datentypen ähnlich in C und MATLAB, dort aber automatische Typzuweisung möglich double a = 2; Arrays a = double( 2 ); aber auch a = 2; nahezu identisch in C und MATLAB, jedoch startet der Index in C mit 0 in MATLAB mit 1. In C verwet man eckige Klammern beim Zugriff auf ein Element, in MATLAB runde: z.b. a(5) = 4711; In MATLAB einfaches Erzeugen von mehrdimensionalen Arrays (Liste): z.b. a = [ 2, 3, 4; 1, 2, 5 ]; length : Länge des Vektors, size : Zahl der Zeilen und Spalten Funktionen in C Funktionskopf: mit Namen + Parameter RTyp FName ( PTyp1 p1, PTyp2 p2,... ) z.b. double sin( double x ) Funktionsrumpf mit Programm-Code in Block {... } mehrere Funktionen in einer c-datei, Deklaration über Header-Datei include... Kompilieren + evtl. Linken, Haupt-Programm main zum Testen, exe-datei mit dem Namen der C-Code- Datei oder obj-file, Library, DLL, Aufruf der exe.datei über den Namen, Konsolenanwung startet dann mit main in MATLAB startet mit Bezeichner function, keine Typ-Angaben function RName = FName ( p1, p2,... ) z.b. function y = sin( x ) Funktionsrumpf mit Programm-Code direkt unter Funktionskopf, bis evtl. nächstes function Name der Datei (M-File) identisch mit Funktion, z.b. M-File sin.m für Funktion sin darunter evtl. weitere lokale (statische) Funktionen Interpretierter Programm-Code (kein Kompilieren) Aufruf der Funktion direkt über den Namen, damit startet direkt diese Funktion Informatik 2 1
Beispiel: Funktionalität: Addition zweier Zahlen a und b, Rückgabe der Summe c = a + b; C-Version in Datei addiere.c #include <stdio.h> #include "addiere.h" // mit Funktionskopf void main( void ) { double a = 2, b = 3, c = 0; c = addiere( a, b ); printf( "%g + %g = %g \n", a, b, c ); Header-Datei addiere.h mit Funktions-Deklaration: double addiere( double a, double b ); Vor dem Aufruf noch Kompilieren und Linken von addiere.exe } MATLAB-Version in Datei addiere.m double addiere( double a, double b ) function c = addiere( a, b ) { return( a+b ); c = a+b; %% keine Typ-Angabe } Aufruf im Command-Window: Aufruf in Konsole: >> addiere; >> c = addiere( 2, 3 ); 2 + 3 = 5 c = 5 Parameter-Übergabe ähnlich in C und MATLAB, dort Übergabe an Funktion ohne Typ-Check double addiere( double a, double b ) function c = addiere( a, b ) Rückgabe: als Funktionswert, in C über return(c), in MATLAB über Zuweisung an Parameter c =... in C auch über Zeiger: void fname( double * pc ) {...; *pc = a + b;... } Mehrere Rückgabe-Parameter über Zeiger void fname( double * pc1, double * pc2,... ) Rückgabe als Liste function [u,f] = Kreis( r ) u = Umfang( r ); f = Flaeche( r ); Informatik 2 2
Ausgabe auf dem Bildschirm nahezu identisch in C und MATLAB, dort ' an Stelle von " printf( "Hello, world %s \n", t ); fprintf( 'Hello, world %s \n', t ); Daten von Tastatur einlesen x = input( 'Bitte Zahl eingeben: ' ); t = input( 'Bitte Text eingeben: ' ); Option s für reine Text-Eingabe: x = input( 'Bitte Text eingeben: ', 's' ); Operatoren nahezu identisch in C und MATLAB, wobei dort die Kurzformen (++, +=,...) fehlen: Arithmetisch: +, -, *, /, ++, -- Zuweisungen: =, +=, - =, *=, /= Vergleiche: >, >=, <, <=, = =,!= (ungleich) Logisch: && (UND). (ODER),! (NICHT) +, -, *, / = >, >=, <, <=, = =, ~= (ungleich) && (UND), (ODER), ~ (NICHT) Bedingungen identisch in C und MATLAB, mit den oben angeführten Operatoren, z.b. ( x < 9 ), ( x = = 0 ), ( x >-1 && x < 1 ) Informatik 2 3
Verzweigungen (if... else) nahezu identisch in C und MATLAB, dort Schlüsselwort an Stelle der Blöcke {... } if( x > 0 ) if( x > 0 ) {... }... else else {... }... Beispiel function r = mysqrt( p ) if( p < 0 ) fprintf( 'FEHLER: Negatives Argument %g \n', p ); r = 0; else r = sqrt( p ); Zählschleife nahezu identisch in C und MATLAB, leicht unterschiedliche Notation k++ für Inkrement um 1 Inkrementwert 1 als 2. Parameter for ( k=1; k<=5; k++ ) for ( k = 1 : 1 : 5 ) { a(k) = k * k; a[k] = k * k; } Beispiel function quadrat( ) for( n=1:6 ) %% automatisch Inkrement 1 q = n * n; fprintf( ' %3d %3d \n', n, q ); Wiederholschleife nahezu identisch in C und MATLAB while( x > 0 ) {... } while( x < 0 )... Informatik 2 4
Strukturen nahezu identisch in C und MATLAB dienen zum Strukturieren von Daten, z.b. Personal-Karte in Einwohnermeldeamt struct mytyp {double n1; double n2;} var; var.n1 = 5; var.n2 = var.n1 * 2; Beispiel pers.vorname = 'Otto'; pers.nachname = 'Müller'; pers.nummer = '0815'; pers.gebdat = '24.12.1980';... var = struct('n1',0, 'n1',0); var.n1 = 5; var.n2 = var.n1 * 2; Vereinfacht die Datenübergabe, da kompletter Struct übergeben werden kann. In MATLAB: Deklaration pers= struct( 'Vorname', [ ], 'Nachname', [ ],... ); nicht zwing notwig, es reicht direkte Zuweisung: pers.vorname = 'Otto';... Datei-Operationen nahezu identisch in C und MATLAB FILE * fid = fopen( "d.txt txt", "w"); fid = fopen( 'd.txt txt', 'w'); fprintf( fid, "Hello file \n" ); fprintf( fid, 'Hello file \n' ); fclose( fid ); fclose( fid ); Datei öffnen: fopen, mit den Optionen: w = write : Schreiben r = read : Lesen a = app : Zeilen anhängen Rückgabe File-Identifier, zum Zugriff auf geöffnete Datei, z.b. zum Beschreiben über fprintf oder zum Auslesen von Daten z.b. über fgetl Datei nach den Operationen schließen: fclose Informatik 2 5
Strings nahezu identisch in C und MATLAB, in C mit abschließem Null-Byte char txt[5] = "vier"; txt = 'vier'; printf( "%s \n", txt ); fprintf( '%s \n', txt ) String-Funktionen meist identisch sprintf int2str str2double strcmp length... Zusammenbau von Texten, analog fprintf wandelt Ganz-Zahl in String wandelt String in Zahl vergleicht zwei Texte, gibt in MATLAB 1 zurück, wenn gleich Länge des Arrays, in diesem Fall des Strings Grafik in C nicht Bestandteil des Basis-Moduls 2-dimensionale Grafik: Plot eines Vektors plot( [2,3,0,4,3] ); oder Plot zweier Vektoren zueinander (x/y) plot( [10,20,30,40,50], [2,3,0,4,3] ); 3-dimensionale Grafik: Plot eines Vektorfeldes [X,Y] = meshgrid(-8:.5:8); R = sqrt(x.^2 + Y.^2) + eps; Z = sin(r)./r; surf(x,y,z) Informatik 2 6