-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEigenwert10000.m
More file actions
executable file
·241 lines (194 loc) · 6.54 KB
/
Eigenwert10000.m
File metadata and controls
executable file
·241 lines (194 loc) · 6.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
Werte = sparse(8,300);
aa = 1;
bb = 9;
cc = 17;
durchgaenge = 5
for es = 0 : 1 : (durchgaenge-1)
sprintf('Durchgangnummer: %i von %i',es,durchgaenge)
fflush(stdout)
% neuer Versuch, alles neu geschrieben
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Parameter
n = 10^4; % Matrix Groesse [n*n]
b = 5000 % Blockgroesse (Teilmatrizengroesse) MUSS MIT n KOMPATIEBEL SEIN
R = zeros(n); % Matrix mit Groesse [n*n]
maxSchlaufen = 100000; % maximale Schlaufendurgaenge bei Eigenvektorberechnung
maxSchlaufenTeil = 10000;
maxSchlaufenTeilSchluss = 100000;
genauigkeit = 1e4;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Matrix Generator (Pseudo Google Matrix; Spalten Summe = 1; Bandmatrix)
zufall = unifrnd(0,1); % ergibt Zufaellige float Zahl [0;1]
R(:,1) = [zufall; 1-zufall; zeros(n-2,1)]; % 1. Spalte befuellen (Zufallszahlen Summe=1, mit nullen auffuellen)
parfor spalte = 2:n-1 % Spalten fuellen von 2.er bis n-1.er
zufall = unifrnd(0,1); % ergibt Zufaellige float Zahl [0;1]
zufall1 = unifrnd(0,1-zufall);
R(:,spalte) = [zeros(spalte-2,1); zufall; zufall1; 1-zufall-zufall1; zeros(n-(spalte-2)-3,1)];
end
zufall = unifrnd(0,1);
R(:,n) = [zeros(n-2,1); zufall; 1-zufall];
% Test: Summe aller Spallten sollte Null sein
%parfor spalte = 1:n
% if(sum(R(:,spalte)) > 1)
% sprintf('Error Spalte: %i Summe = %f', spalte, sum(R(:,spalte)))
% end
%end
% Forschleif für Datensammlung sollten 1000 Schritte sein und das 100 mal mit einer neuen Matrix R
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Eigenwertberechnung original ueber gesamte Matrix
genauGenug = 0;
uOriginal = ones(n,1);
schritteOriginal = 0;
uOrigAlt = zeros(n,1);
tic;
while( not(genauGenug) && (schritteOriginal < maxSchlaufen))
% Eigenvektorberechnung solange genau genug oder Schalufendurchgaenge genug oft
uOriginal = (R*uOriginal) / norm(R*uOriginal);
schritteOriginal = schritteOriginal +1;
% Test: ob Genauigkeit erreicht
if(uOrigAlt == abs(round(uOriginal*genauigkeit)))
genauGenug = 1;
end
uOrigAlt = abs(round(uOriginal*genauigkeit));
end
zeitOriginal = toc
eigenwertOriginal = uOriginal' * R * uOriginal
if(schritteOriginal == maxSchlaufen)
sprintf('Original Eigenwertberechnung max. Schlaufen erreicht: %i',schritteOriginal)
else
schritteOriginal
end
fflush(stdout)
% nur noch 1 mal ueber die gesammte Matrix
for q = 0 : 1 : 7
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Eigenwertberechnung mit Teilmatrizen
uTeil = ones(n,1);
tic;
% 10 Durchgaenge ohne Normierung
parfor teil = 1:n/b % Originalmatrix parallel aufteilen in Teilmatrizen mit Groesse [b*b]
genauGenug = 0;
uTeilMatrix = ones(b,1);
schritteTeilMatrix = 0;
uTeilAlt = zeros(b,1);
% R(zeile von:bis, spalte von:bis)
teilmatrix = R( (b*(teil-1)+1:b*(teil-1)+b) , (b*(teil-1)+1:b*(teil-1)+b) );
% 10 Durchgaenge ohne Normierung
for temp=1:10
uTeilMatrix = teilmatrix*uTeilMatrix;
end
uTeil(b*(teil-1)+1:b*(teil-1)+b) = uTeilMatrix;
end
% norm Berechnung ueber gesammte Matrix
globalNorm = norm(R*uTeil)
uTeil = (R*uTeil) / norm(R*uTeil);
globalNorm = norm(R*uTeil)
uTeil = (R*uTeil) / norm(R*uTeil);
globalNorm = norm(R*uTeil)
% Teilmatrizenberechnung solang Genauigkeit oder Schlaufen max erreicht
parfor teil = 1:n/b % Originalmatrix parallel aufteilen in Teilmatrizen mit Groesse [b*b]
genauGenug = 0;
uTeilMatrix = ones(b,1);
schritteTeilMatrix = 0;
uTeilAlt = zeros(b,1);
% R(zeile von:bis, spalte von:bis)
teilmatrix = R( (b*(teil-1)+1:b*(teil-1)+b) , (b*(teil-1)+1:b*(teil-1)+b) );
% Durchgaenge mit Globaler Normierung
for temp=1:10
uTeilMatrix = teilmatrix*uTeilMatrix;
end
uTeilAlt = zeros(b,1);
while( not(genauGenug) && (schritteTeilMatrix < maxSchlaufenTeil))
% Eigenvektorberechnung solange genau genug oder Schalufendurchgaenge genug oft
uTeilMatrix = teilmatrix*uTeilMatrix;% / globalNorm;
schritteTeilMatrix = schritteTeilMatrix +1;
% Test: ob Genauigkeit erreicht
if(uTeilAlt == abs(round(uTeilMatrix*genauigkeit)))
genauGenug = 1;
end
uTeilAlt = abs(round(uTeilMatrix*genauigkeit));
end
if(schritteTeilMatrix == maxSchlaufenTeil)
sprintf('Teilmatrix max. Schlaufen erreicht: %i',schritteTeilMatrix)
end
uTeil(b*(teil-1)+1:b*(teil-1)+b) = uTeilMatrix;
end
% soviele Durchgaenge auf gesamter Matrix bis Genauigkeit oder Schritte max erreicht
schritteTeilTot = 0;
genauGenug = 0;
uTeilTotAlt = zeros(n,1);
zeitTeilTeil = toc;
while( not(genauGenug) && (schritteTeilTot < maxSchlaufenTeilSchluss))
% Eigenvektorberechnung solange genau genug oder Schalufendurchgaenge genug oft
uTeil = (R*uTeil) / norm(R*uTeil);
schritteTeilTot = schritteTeilTot + 1;
% Test: ob Genauigkeit erreicht
if(uTeilTotAlt == abs(round(uTeil*genauigkeit)))
genauGenug = 1;
end
uTeilTotAlt = abs(round(uTeil*genauigkeit));
end
zeitTeilGesamt = toc
zeitTeilSchluss = zeitTeilGesamt - zeitTeilTeil
eigenwertTeil = uTeil' * R * uTeil
if(schritteTeilTot == maxSchlaufen)
sprintf('Teilmatrizen Eigenwertberechnung max. Schlaufen erreicht: %i',schritteTeilTot)
else
schritteTeilTot
end
Werte([aa]) = b;
Werte([bb]) = zeitTeilGesamt;
Werte([cc]) = zeitOriginal;
save myWerte Werte;
aa = aa + 1;
bb = bb + 1;
cc = cc + 1;
if q == 0
b = 2500
elseif q == 1
b = 2000
elseif q == 2
b = 1250
elseif q == 3
b = 1000
elseif q == 4
b = 500
elseif q == 5
b = 250
else
b = 100
end
fflush(stdout)
end
aa = aa + 16;
bb = bb + 16;
cc = cc + 16;
end
% Bearbeitung der Daten Mittelwerte Berechnen
WerteDurchschnitt = sparse(8,3);
aa = 1;
bb = 9;
cc = 17;
DurchschnittZeitTeil = 0;
DurchschnittOriginal = 0;
for qqq = 0 : 1 : 7
WerteDurchschnitt([aa]) = Werte([aa]);
DurchschnittZeitTeil = 0;
DurchschnittOriginal = 0;
for q = bb : 24 : ( ((durchgaenge-1)*24) + bb)
DurchschnittZeitTeil = (DurchschnittZeitTeil + Werte([q]));
end
WerteDurchschnitt([bb]) = (DurchschnittZeitTeil / durchgaenge);
for q = cc : 24 : ( ((durchgaenge-1)*24) + cc)
DurchschnittOriginal = (DurchschnittOriginal + Werte([q]));
end
WerteDurchschnitt([cc]) = (DurchschnittOriginal / durchgaenge);
aa = aa + 1;
bb = bb + 1;
cc = cc + 1;
end
csvwrite("WerteDurchschnitt.csv", Werte)
csvwrite("TeilmatrixGroesse10000.csv", WerteDurchschnitt(1:8, 1))
csvwrite("ZeitTeil10000.csv", WerteDurchschnitt(1:8, 2))
csvwrite("ZeitOriginal10000.csv", WerteDurchschnitt(1:8, 3))