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