Vorlesung 8: Fortgeschrittene Techniken
Contents
Preallocation
Matlab uebernimmt fuer uns die "Reservierung" von Speicherplaetzen fuer die verwendeten Variablen. In einigen Faellen kann man durch eigene Bereitstellung von Speicherplaetzen allerdings die Laufzeit von Programmen deutlich verkuerzen.
Beispiel 1:
clear all; tic x=zeros(1,1); % ohne Preallocation for k=2:1000000 x(k) = x(k-1)+5; end toc
Elapsed time is 1.123359 seconds.
clear all tic x = zeros(1,1000000); %mit Preallocation for k=2:1000000 x(k) = x(k-1)+5; end toc
Elapsed time is 1.098000 seconds.
Beispiel 2:
clear all % ohne Preallocation tic for i=1:3000 for j=1:3000 x(i,j) = i+j; end end toc
Elapsed time is 15.651666 seconds.
clear all tic x = zeros(3000); % mit Preallocation for i=1:3000 for j=1:3000 x(i,j) = i+j; end end toc
Elapsed time is 8.671534 seconds.
Beispiel 3:
clear all % ohne Preallocation tic for i=1:300 for j=1:300 for k=1:300 x(i,j,k) = i+j+k; end end end toc
Elapsed time is 47.883748 seconds.
clear all tic x = zeros(300,300,300); % mit Preallocation for i=1:300 for j=1:300 for k=1:300 x(i,j,k) = i+j+k; end end end toc
Elapsed time is 43.793764 seconds.
Cell arrays
Cell arrays erlauben die Ansammlung von unterschiedlichen Objekten in einer Variablen.
Beispiel: T(n) sei der Vektor mit den Koeffizienten des n-ten Tschebyscheff Polynoms. T(n) ist ein Polynom n-ten Grades. Wir wollen die Koeffizienten der Polynome speicher, d.h. wir speichern Vektoren unterschiedlicher Laenge.
Zur Erzeugung und fuer den Zugriff auf cell arrays benutzen wir geschweifte Klammern.
T = cell(1,10); T(1:2) = {[1], [1,0]}; for n=2:9 T{n+1} = [2*T{n} 0] - [0 0 T{n-1}]; end % Koeffizienten des 5-ten Tschebyscheff Polynoms: T{6}
ans = 16 0 -20 0 5 0
Zeichne das n-te Tschebyscheff Polynom
n = 9; x = -1:0.001:1; y = polyval(T{n+1},x); plot(x,y);
Structures
Strukturen sind im wesentlichen cell arrays die durch Namen statt Zahlen indiziert sind.
Beispiel: Erzeugung einer Studenten-Struktur
clear all; student.name = 'Ida'; student.aufg = [10 10 7 9 10]; student.kl = [88 94]; student(2).name = 'Michel'; student(2).aufg = [4 6 7 3 0]; student(2).kl = [53 66];
Lese Studentendaten aus einem externen File ein.
clear all filename = 'liste.txt'; % open the file fid = fopen(filename); % make sure the file is not empty finfo = dir(filename); fsize = finfo.bytes; if fsize > 0 tline = fgetl(fid); i=1; while ischar(tline) student(i).name = sscanf(tline, '%s%'); student(i).aufg = sscanf(tline, '%*s %d %d %d %d %d%')'; student(i).kl = sscanf(tline, '%*s %*d %*d %*d %*d %*d %d %d')'; tline = fgetl(fid); i = i+1; end end % close the file fclose(fid);
Schreibe die Klausurergebnisse in eine Matrix (1. Spalte entspricht Note aus 1. Klausur; 2. Spalte entspricht Note aus 2. Klausur)
A = cat(1,student.kl);
Nun bestimmen wir die Note.
for i=1:10 punkte = max(student(i).kl); note = 5.0; if punkte >= 90 note = 1.0; elseif punkte >= 80 note = 2.0; elseif punkte >= 70 note = 3.0; elseif punkte >= 60 note = 4.0; end student(i).note = note; end
Nun wollen wir noch den Notendurchschnitt berechnen. Dazu schreiben wir zunaechst die Noten wieder in einen Vektor.
B = cat(1,student.note);
m = mean(B);
fprintf('Der Notendurchschnitt der Klausur ist %d\n',m);
Der Notendurchschnitt der Klausur ist 1.700000e+00