Doppelsumme in Matlab < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 17:04 Do 07.06.2012 | Autor: | Katthi |
Hallo Leute,
ich habe mal eine Frage zur Implementierung einer Doppelsumme in matlab.
Und zwar soll ich eine Funktion programmieren, die mir die Abweichung der Spalten von einem Orthonormalsystem angibt. Dabei habe ich gegeben, wie das aussehen soll und zwar,
orth_error(X) = || [mm] X^T*X [/mm] - [mm] I||^2 [/mm] und die norm ist die frobenius norm und I die Einheitsmatrix.
Nur wie programmiere ich die Frobeniusnorm? da kommen ja zwei Summenzeichen drin vor, einmal über i und einmal über j.
habe leider keinen Weg gefunden, dass es irgendwie läuft, immer kommen irgendwelche Fehler..
und dann soll ich eine vandermonde-matrix mit einem angegeben Code aufstellen:
function [V]= vandermonde(n)
x = 1:n;
for j = 1:n
V(:,j) = x.^(j-1);
end
aber so läuft das bei mir nicht. sieht das denn so richtig aus? Weil allgemeines wo eine Variable auch wirklich drin steht, kann mtlab doch garnicht?! Sollen dann diese Vandermonde-Matrix für n= 5:5:150 auf verschiedene Verfahren loslassen und dann davon orth_error bestimmen. aber wie gesagt läuft beides leider nicht =(
ich hoffe, dass mir jemand von euch weiterhelfen kann.
Viele Grüße
Katthi
|
|
|
|
> Hallo Leute,
>
> ich habe mal eine Frage zur Implementierung einer
> Doppelsumme in matlab.
> Und zwar soll ich eine Funktion programmieren, die mir die
> Abweichung der Spalten von einem Orthonormalsystem angibt.
> Dabei habe ich gegeben, wie das aussehen soll und zwar,
> orth_error(X) = || [mm]X^T*X[/mm] - [mm]I||^2[/mm] und die norm ist die
> frobenius norm und I die Einheitsmatrix.
> Nur wie programmiere ich die Frobeniusnorm?
Eigentlich gar nicht, wenn es nicht explizit verlangt wird:
norm(X'*X-eye(n),'fro')
für die Größe n und eine Matrix [mm] $X\in \IR^{n\times n}$
[/mm]
> da kommen ja
> zwei Summenzeichen drin vor, einmal über i und einmal
> über j.
> habe leider keinen Weg gefunden, dass es irgendwie läuft,
> immer kommen irgendwelche Fehler..
>
> und dann soll ich eine vandermonde-matrix mit einem
> angegeben Code aufstellen:
> function [V]= vandermonde(n)
> x = 1:n;
> for j = 1:n
> V(:,j) = x.^(j-1);
> end
Die geht doch!
vandermonde(5) gibt das richtige aus!
welches Problem hast du mit:
n=6;
X=vandermonde(n);
ergebnisnorm= norm(X'*X-eye(n),'fro');
>
> aber so läuft das bei mir nicht. sieht das denn so richtig
> aus? Weil allgemeines wo eine Variable auch wirklich drin
> steht, kann mtlab doch garnicht?! Sollen dann diese
> Vandermonde-Matrix für n= 5:5:150 auf verschiedene
> Verfahren loslassen und dann davon orth_error bestimmen.
> aber wie gesagt läuft beides leider nicht =(
>
> ich hoffe, dass mir jemand von euch weiterhelfen kann.
>
> Viele Grüße
>
> Katthi
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:15 Do 07.06.2012 | Autor: | Katthi |
ah ja die vandermonde passt. hatte die als V.m abgespeichert, dann muss ich ja auch V(5) abrufen.. oka..
aber die 'fro' von matlab darf ich eben nicht benutzen, leider nur zur Kontrolle ;) ich muss das selber programmieren und da stolpere ich halt über die Doppelsumme. hatte das mit einer for schleife angefangen, aber weiß nicht, wie genau der Hauptteil dann aussieht...
Viele Grüße
Katthi
|
|
|
|
|
> ah ja die vandermonde passt. hatte die als V.m
> abgespeichert, dann muss ich ja auch V(5) abrufen.. oka..
>
> aber die 'fro' von matlab darf ich eben nicht benutzen,
> leider nur zur Kontrolle ;)
Schade
> ich muss das selber
> programmieren und da stolpere ich halt über die
> Doppelsumme. hatte das mit einer for schleife angefangen,
Genauso
> aber weiß nicht, wie genau der Hauptteil dann aussieht...
Ich gib dir mal Bausteine:
[mm]\sum_{i=1}^na_{ji}[/mm] entspricht sum(A(j,:))
[mm]a_{ij}^2[/mm] erreicht man durch A(i,j).^2 (der Punkt dazwischen ist wichtig!)
[mm] $\sum_{i=1}^n \text{irgendwas}$ [/mm] entspricht:
~~~~~~~
totalsum=0;
for i=1:n
totalsum = totalsum + irgendwas
end
~~~~~~~~
Naja und die Wurzel ziehst du über sqrt()
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:35 Do 07.06.2012 | Autor: | Katthi |
hmm ja.. also mein Problem ist, dass ich ja für das [mm] (a_ij)^2 [/mm] ja quasi das einsetzen muss, was in der Frobeniusnorm drin steht. also A'*A-I. soll ich das dann irgendwie Y nennen oder so? und kann ich dann einfach sagen Y(i,j)?
und ich habe ja eine summe, die über j läuft und eine über i. welches sum entspricht denn dann welchem Index? entspricht dann dein "irgendwas" der zweiten summe??
|
|
|
|
|
> hmm ja.. also mein Problem ist, dass ich ja für das
> [mm](a_ij)^2[/mm] ja quasi das einsetzen muss, was in der
> Frobeniusnorm drin steht. also A'*A-I. soll ich das dann
> irgendwie Y nennen oder so?
Den Namen darfst du dir frei aussuchen.
> und kann ich dann einfach sagen
> Y(i,j)?
Lass das doch erst einmal weg und schreibe dir eine Matlab-Funktion, die für eine gegebene Matrix A (oder wie auch immer) die Norm berechnet. Im Prinzip brauchst du doch unabhängig von der Aufgabenstellung nur die Matlabfunktion nachbauen.
> und ich habe ja eine summe, die über j läuft und eine
> über i. welches sum entspricht denn dann welchem Index?
> entspricht dann dein "irgendwas" der zweiten summe??
Das waren doch nur Vorschläge, wie ich die Funktion eben geschrieben habe.
>
Dann doch ausführlicher
for i=1:n
for j=1:n
...
end
end
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:04 Do 07.06.2012 | Autor: | Katthi |
aaaaaaalso :D
ich bekomme zumindest schon mal Werte.
habe jetzt zwei Funktionen, einmal die Norm und dann noch eine Funktion, wo ich dann das, was in der Norm stehen soll definiert habe, also als Matrix B.
Aber wenn ich dass dann in meiner Funktion orth_error aufrufe, dann bekomme ich ganz viele sum raus und eigentlich will ich ja dieses orth_error als Wert. ist das dann mein sum Wert? (mal davon abgesehen, dass ich garnicht richtig verstehe, wie dieser Wert mir quantitativ angeben soll, wie stark die Spalten der Matrix von einem Orthonormalsystem abweichen.....)
so sieht es bei mir aus:
function e = orth_error(A)
[n,m] = size(A);
sum = 0;
for i = 1:n
for j = 1:m
sum = sum + B.^2 ;
end
end
end
function B = matrix (~,~)
B = A'*A - eye(size(A));
end
die Wurzel hebt sich ja weg, da bei der Norm ja die Wurzel wäre, aber ich diese Norm quadrieren soll...
|
|
|
|
|
> aaaaaaalso :D
>
> ich bekomme zumindest schon mal Werte.
> habe jetzt zwei Funktionen, einmal die Norm und dann noch
> eine Funktion, wo ich dann das, was in der Norm stehen soll
> definiert habe, also als Matrix B.
> Aber wenn ich dass dann in meiner Funktion orth_error
> aufrufe, dann bekomme ich ganz viele sum raus und
> eigentlich will ich ja dieses orth_error als Wert. ist das
> dann mein sum Wert? (mal davon abgesehen, dass ich garnicht
> richtig verstehe, wie dieser Wert mir quantitativ angeben
> soll, wie stark die Spalten der Matrix von einem
> Orthonormalsystem abweichen.....)
>
> so sieht es bei mir aus:
>
> function e = orth_error(A)
> [n,m] = size(A);
> sum = 0;
> for i = 1:n
> for j = 1:m
B=A(i,j); fehlt doch hier?!
> sum = sum + B.^2 ;
Das ist mir nicht so ganz klar, was da das B macht.
> end
> end
>
> end
Naja das ist dann aber nicht der orth_error sondern eher, die Norm zum Quadrat.
Ich habe es so ähnlich:
function y = frobnorm(A)
[n,m] = size(A);y = 0;
for i=1:n
y = y + sum(A(i,:).^2);
end
y=sqrt(y);
end
~~~~~~~~~~~~~~~~~+
A=rand(5);
frobnorm(A'*A-eye(5))
>
>
> function B = matrix (~,~)
Das kenne ich leider nicht mit der Tilde.
>
> B = A'*A - eye(size(A));
>
> end
>
>
> die Wurzel hebt sich ja weg, da bei der Norm ja die Wurzel
> wäre, aber ich diese Norm quadrieren soll...
Ja, das stimmt.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:24 Do 07.06.2012 | Autor: | Katthi |
das mit der Tilde hat der mir mal angezeigt, dass man das so machen soll, wenn das i und j variabel ist....
ich glaube ich habe das auch nicht gut dargestellt, wie genau meine Aufgabe ist...
also ich soll dieses orth_error als funktion schreiben.
Mein B ist jetzt einfach das, wie wir in der Aufgabe das innerhalb der Frobeniusnorm definiert haben.
Ist das denn jetzt bei mir eine Summe über beide Indizes? Weil bei dir hast du ja nur von i = 1:n...
es läuft also auf soetwas hinaus in der Aufgabe:
um eine Vandermondematrix V (n) beliebiger Größe n zu erstellen. Schreiben
Sie ein Programm, das für n = 5; 10; : : : ; 150 die Q-Faktoren von V (n)
per
(1) Gram-Schmidt Algorithmus
(2) Modiziertem Gram-Schmidt Algorithmus
(3) qr-Funktion aus matlab
berechnet. Die Fehlerindikatoren [mm] e_k [/mm] = [mm] orth_error(Q_k), [/mm] k = 1; 2; 3 der drei
Verfahren sollen (in der genannten Reihenfolge) als Zeilen einer Tabelle in
Exponentialdarstellung ausgeben werden:
fprintf('%d: %e %e [mm] %e\n',n, [/mm] e1, e2, e3);
meinst du ich soll dann die frobeniusnorm separat noch als function schreiben und dann erst in die orth_error function einfügen??
tut mir leid für die Unübersichtlichkeit...
|
|
|
|
|
> das mit der Tilde hat der mir mal angezeigt, dass man das
> so machen soll, wenn das i und j variabel ist....
>
> ich glaube ich habe das auch nicht gut dargestellt, wie
> genau meine Aufgabe ist...
> also ich soll dieses orth_error als funktion schreiben.
> Mein B ist jetzt einfach das, wie wir in der Aufgabe das
> innerhalb der Frobeniusnorm definiert haben.
Das ist unglücklich, wenn du das B global definierst. Dann ist es zwar da und die Funktion kann darauf zugreifen. Bloß, merkt man sich dass? Dann lieber als Parameter.
Also
function y= orth_err(X)
n = size(X);
y = frobnorm(X'*X-eye(n));
end
Dann ist es lesbar.
> Ist das denn jetzt bei mir eine Summe über beide Indizes?
> Weil bei dir hast du ja nur von i = 1:n...
Ich spare mir die innere Schleife. Für
for j=1:n
summe = summe + a(i,j)
end
kann man auch
summe = sum(A(i,:))
schreiben. "A(i,:)" ist die i-te Zeile und "sum" summiert alle Elemte auf.
Ausführlich wäre es dann:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function y = frobnorm(A)
[n,m] = size(A);y = 0;
for i=1:n
for j=1:n
y= y + A(i,j) ^ 2;
end
end
y=sqrt(y);
end
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function y = frobnorm(A)
[n,m] = size(A);y = 0;
for i=1:n
y = y + sum(A(i,:).^2);
end
y=sqrt(y);
end
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
>
> es läuft also auf soetwas hinaus in der Aufgabe:
> um eine Vandermondematrix V (n) beliebiger Größe n zu
> erstellen.
haben wir ja schon.
> Schreiben
> Sie ein Programm, das für n = 5; 10; : : : ; 150 die
> Q-Faktoren von V (n)
> per
> (1) Gram-Schmidt Algorithmus
> (2) Modiziertem Gram-Schmidt Algorithmus
> (3) qr-Funktion aus matlab
> berechnet.
Das sind dann wohl 3 weitere Funktionen.
> Die Fehlerindikatoren [mm]e_k[/mm] = [mm]orth_error(Q_k),[/mm] k
> = 1; 2; 3 der drei
> Verfahren sollen (in der genannten Reihenfolge) als Zeilen
> einer Tabelle in
> Exponentialdarstellung ausgeben werden:
> fprintf('%d: %e %e [mm]%e\n',n,[/mm] e1, e2, e3);
>
> meinst du ich soll dann die frobeniusnorm separat noch als
> function schreiben und dann erst in die orth_error function
> einfügen??
Ja. Das denke ich schon. Da würde ich auch die paar Millisekunden in Kauf nehmen, die das länger dauert. Irgendwann kann man die Funktionen noch einmal gebrauchen, und dann muss man sich erinnern, was man mal geschrieben hat.
>
> tut mir leid für die Unübersichtlichkeit...
Du müsstest mal meine Mitschriften sehen!
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:45 Do 07.06.2012 | Autor: | Katthi |
also das sieht schonmal gut aus, wenn ich das mal mit V(5) z.B. teste, dann kommt da auch nen schön kleiner Fehler raus, das ist dann ja denke ich mal passend =)
Oh man ich bin dir mega dankbar, jedes mal ziehst du mich aus meinem Gehirnchaos :D
Sooo, aber ich weiß nicht, wie ich das dann für den Rest der Aufgabe alles kombinieren soll.
die beiden Gram-Schmidt-Verfahren habe ich schon, Wobei der mir beim klassischen immer Q und R ausgibt, obwohl ich das garnicht will, und meistens auch noch nen ans, weißt du woran das liegt?
Also ich kann das ja schon mal so anfangen, dass ich sage
n = [5:5:150]
for k = n
und dann jetzt irgendwie die Verfahren,
end
dann geht der doch alle n durch??
|
|
|
|
|
> also das sieht schonmal gut aus, wenn ich das mal mit V(5)
> z.B. teste, dann kommt da auch nen schön kleiner Fehler
> raus, das ist dann ja denke ich mal passend =)
>
> Oh man ich bin dir mega dankbar, jedes mal ziehst du mich
> aus meinem Gehirnchaos :D
>
> Sooo, aber ich weiß nicht, wie ich das dann für den Rest
> der Aufgabe alles kombinieren soll.
> die beiden Gram-Schmidt-Verfahren habe ich schon,
Das ist gut!
> Wobei
> der mir beim klassischen immer Q und R ausgibt, obwohl ich
> das garnicht will,
Wenn du [Q,R] = deineFunktion(...)
schreibst, dann kannst du ja dann mit Q weiterarbeiten (sofern auch Q und R zurückgegeben werden)
> und meistens auch noch nen ans, weißt
> du woran das liegt?
Irgendwo fehlt da am Ende eines Befehls ein Semikolon. Dieses würde nämlich diese ans-Ausgabe unterrdücken
y=1:5
y=1:5;
>
> Also ich kann das ja schon mal so anfangen, dass ich sage
> n = [5:5:150]
> for k = n
> und dann jetzt irgendwie die Verfahren,
> end
> dann geht der doch alle n durch??
Sollst du ja laut Aufgabenstellung auch.
Ich würde das genauso machen, wie du schriebst:
DATENMATRIX = zeros(30,3) % hier werden Fehler ortherror abgelegt
currentpos = 1;
for n=5:5:150
% Matrix erstellen
% erstes Verfahren drauf anwenden
% das ortherror berechnen
DATENMATRIX(currentpos,1) = ortherr; % in Zeile currentpos Spalte 1
% zweite Verfahren drauf anwenden
% das ortherror berechnen
DATENMATRIX(currentpos,2) = ortherr; % in Zeile currentpos Spalte 2
% dritte Verfahren drauf anwenden
% das ortherror berechnen
DATENMATRIX(currentpos,3) = ortherr; % in Zeile currentpos Spalte 3
currentpos = currentpos+1; % neue Zeile in DATENMATRIX
end
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:43 Do 07.06.2012 | Autor: | Katthi |
ich muss das mit so einem bestimmten Befehl in eine Tabelle schreiben lassen leider... =(
fprintf('%d: %e %e [mm] %e\n',n, [/mm] e1, e2, e3);
somit muss ich das ja irgendwie anders machen.. oder kann ich das dann einfach bei dir einfügen? nur halt ohne Datenmatrix, sondern das man das irgendwie mit e1,e2,e3 benennt??
habe das jetzt so dann gemacht:
n = [5:5:150];
for k = n
V(k); % Matrix erstellen
Q1 = qr_gram_schmidt(V(k));% erstes Verfahren drauf anwenden
e1 = orth_error(Q1);% das ortherror berechnen
Q2 = qr_gram_schmidt(V(k)); % zweite Verfahren drauf anwenden
e2 = orth_error(Q2);% das ortherror berechnen
Q3 = qr(V(k)); % dritte Verfahren drauf anwenden
e3 = orth_error(Q3);% das ortherror berechnen
end
fprintf('%d: %e %e [mm] %e\n',n, [/mm] e1, e2, e3);
wenn ich das laufen lasse wirft der mir aber nur eine Tabelle in 20er Schritten aus...
|
|
|
|
|
> ich muss das mit so einem bestimmten Befehl in eine Tabelle
> schreiben lassen leider... =(
> fprintf('%d: %e %e [mm]%e\n',n,[/mm] e1, e2, e3);
>
> somit muss ich das ja irgendwie anders machen.. oder kann
> ich das dann einfach bei dir einfügen? nur halt ohne
> Datenmatrix, sondern das man das irgendwie mit e1,e2,e3
> benennt??
>
> habe das jetzt so dann gemacht:
> n = [5:5:150];
>
> for k = n
>
> V(k); % Matrix erstellen
>
> Q1 = qr_gram_schmidt(V(k));% erstes Verfahren drauf
> anwenden
> e1 = orth_error(Q1);% das ortherror berechnen
>
> Q2 = qr_gram_schmidt(V(k)); % zweite Verfahren drauf
> anwenden
> e2 = orth_error(Q2);% das ortherror berechnen
>
> Q3 = qr(V(k)); % dritte Verfahren drauf anwenden
> e3 = orth_error(Q3);% das ortherror berechnen
end
>
> fprintf('%d: %e %e [mm]%e\n',n,[/mm] e1, e2, e3);
>
end
> wenn ich das laufen lasse wirft der mir aber nur eine
> Tabelle in 20er Schritten aus...
>
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:10 Do 07.06.2012 | Autor: | Katthi |
mist so hatte ich es erst ;)
und das mit den 20er Schritten, kann man das irgendwie beheben?
|
|
|
|
|
> mist so hatte ich es erst ;)
>
> und das mit den 20er Schritten, kann man das irgendwie
> beheben?
Ich erkenn dein Problem nicht. So ähnlich ist doch dein Quelltext ?
for k=5:5:150
A=rand(5);
Q= qr(A);
e=norm(Q);
fprintf('%d:\ n', e);
end
Bei dir fehlt ein \ n (ohne Leerzeichen dazwischen)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:45 Do 07.06.2012 | Autor: | Katthi |
na so stand es auf dem Blatt ;)
vielen vielen Dank dir mal wieder =)
Viele Grüße
Katthi
|
|
|
|