sumsum < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 20:37 Sa 03.02.2007 | Autor: | Bastiane |
Hallo!
Ich habe hier eine Musterlösung zu einer Aufgabe, wo ich einen Teil draus nicht verstehe. Und zwar steht dort:
dist=zeros(256,1);
for ind=0:255
dist(ind+1)=sum(sum(I1==ind));
end
In der ersten Zeile wird also quasi ein Spaltenvektor der "Länge" 256 mit lauter Nullen erzeugt. Und die for-Schleife läuft dann wohl durch alle diese Elemente durch (warum steht da "ind"? Man könnte doch auch genauso einfach "i" schreiben, oder?). So, aber was bitte schön, wird dort gemacht? Was bedeutet "sumsum"? Das konnte ich in der Hilfe von Matlab leider nicht finden. Und "==" scheint wohl auch dort der Vergleichsoperator zu sein, aber was genau wird dort verglichen? I1 ist doch ein Bild (das wurde in einer Aufgabe vorher mal an I1 zugewiesen) und ind ist doch nur der Laufindex der Schleife, oder? Und was wird dann summiert??
Falls es hilft, das ist der Anfang von der Histogrammegalisierung...
Viele Grüße
Bastiane
|
|
|
|
Hallo Bastiane,
da bin ich (hehe). Dann wollen wir mal:
> In der ersten Zeile wird also quasi ein Spaltenvektor der "Länge" 256 mit lauter Nullen erzeugt.
Genau! Das wäre aber gar nicht nötig, weil ja gleich alle Einträge dieses Vektors beschrieben werden. Man kann diese erste Zeile also getrost weglassen, falls die Variable dist noch nicht benutzt wurde. Sonst tut es auch ein "clear dist;".
> Und die for-Schleife läuft dann wohl durch alle diese Elemente durch (warum steht da "ind"? Man könnte doch auch genauso einfach "i" schreiben, oder?).
i ist genauso gut. ind soll vielleicht an Index erinnern, ein sprechenderer Name also? Ansonsten könnte die Variable auch alte_sommerreifen heißen.
> So, aber was bitte schön, wird dort gemacht? Was bedeutet "sumsum"?
> Das konnte ich in der Hilfe von Matlab leider nicht finden.
Da steht ja nicht "sumsum", sondern zweimal "sum". Das sollte in der Hilfe stehen, aber egal: Das Ganze wird auf eine Matrix angewandt, die weiter unten erklärt wird. Das erste sum summiert entlang der Spalten, bildet also einen Zeilenvektor, dessen Einträge die Summen der einzelnen Spalten enthalten. Das zweite (äußere) sum summiert dann diese Summen auf, so dass am Ende ein Skalar dasteht.
> Und "==" scheint wohl auch dort der Vergleichsoperator zu sein, aber was genau wird dort verglichen? I1 ist doch ein Bild (das wurde in einer Aufgabe vorher mal an I1 zugewiesen) und ind ist doch nur der Laufindex der Schleife, oder? Und was wird dann summiert??
Alles richtig! "==" vergleicht und liefert 1 oder 0.
In Matlab gibt es die (sehr nützliche) Besonderheit, dass man Vektoren und Matrizen (auch mehrdimensionale Arrays) mit Skalaren verknüpfen kann. Dann wird jeder Eintrag der Matrix mit diesem Skalar verknüpft. Das Ergebnis ist dann eine Matrix derselben Größe, deren Einträge die Ergebnisse der einzelnen Verknüpfungen sind.
Beim Vergleich ist das Ergebnis eine Matrix aus Einsen und Nullen. An den Stellen mit den Einsen wahr der Vergleich wahr, sonst falsch.
Wenn du also eine Grauwertmatrix I1 mit einem Skalar ind vegleichst, bekommst du eine Matrix, die Einsen an den Stellen enthält, die genau den Grauwert ind haben.
Warum summiert man diese Stellen auf? Das ist nichts anderes als Zählen, denn das Summieren von Einsen ist ja dasselbe, als würde man die Stellen mit diesem Grauwert zählen. Mathematisch wäre das dann:
[mm] $\sum_{(m,n)\in\{1,...,M\}\times\{1,...,N\}, I1(m,n)=ind}1$,
[/mm]
zumindest haben wir diese Schreibweise mehrmals bemüht.
Mein Tipp:
Nimm dir eine kleine Bildmatrix, z.B.:
im = floor(10*rand(10));
und schau dir folgende Ergebnisse an:
im == 5
sum(im == 5)
sum(sum(im == 5))
So, ich hoffe, das hilft etwas...
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:14 So 18.02.2007 | Autor: | Martin243 |
Hallo,
eine kleine Anmerkung, wo wir schon dabei sind:
Das Erzeugen der "zeros" am Anfang beschleunigt die ganze Sache. Dadurch wird sofort der nötige Speicherplatz alloziert, es muss also der Vektor nicht jedesmal erweitert werden. Also vielleicht doch lieber nicht weglassen...
Gruß
Martin
|
|
|
|