Wie soll ich das normalisieren eines Vektors in Matlab, wo die Summe ist 1?
Brauche ich, um zu normalisieren eines Vektors von N ganzen zahlen, so dass:
- Jeder Wert ist proportional zu seinem ursprünglichen Wert (der Wert wird zwischen 0 und 1)
- Die Summe aller Werte ist =1
Zum Beispiel:
Wenn ich einen Vektor
V = [2,2,1,0]
den normalisierten Vektor sollte:
V_norm = [0.4,0.4,0.2,0] % 0.4+0.4+0.2 = 1
Versuchte ich mit vielen Lösungen, die gefunden wurden in dieser Gemeinde und auf der web-und schließlich habe ich es mit diesem code:
part = norm(V);
if part > 0
V_norm = V/part;
else % part = 0 --> avoid "divide by 0"
V_norm = part;
end
Das problem, das funktioniert, wenn:
- alle Elemente des Arrays "0" --> das resultierende array nicht ändern
- nur ein element des Arrays ist >0 und sind alle anderen Elemente = 0 --> das resultierende array: element >0 ist 1 und der andere 0
aber wenn ich einen anderen Fall,obwohl das Ergebnis proportional ist,wird die Summe nicht 0 ist.
Zum Beispiel:
V = [1,0,1]
V_norm = [0.74,0,0.74]
V = [1,1,1]
V_norm = [0.54,0.54,0.54]
(Ich bin mir nicht sicher, ob die Nummer richtig sind, weil ich kann nicht mit Matlab jetzt, aber ich bin mir sicher, dass die Summe > 1 )
Ahy Tip???
Danke im Voraus
InformationsquelleAutor dragonmnl | 2012-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das hängt davon ab. Was ist Ihre norm Funktion?
norm(x)
in MATLAB gibt die norm, also die Summe der Quadrate der Elemente einer normalisierten Vektorx
1.In deinem Beispiel:
sum(v_norm .^ 2)
in der Tat ergibt 1, abersum(v_norm)
nicht, wie erwartet.Was meinst du mit "normalisieren"? Bedeutet das, dass die Division durch einen Wert, der eine gültige mathematische norm Funktion, nach der norm-definition?
Was meinst du mit "proportional"? Folgt daraus, dass alle Elemente multipliziert mit, dass gleichen Nummer? Wenn Sie es tut, und es eine gültige mathematische norm, Sie können nicht garantieren, dass die Summe der Elemente wird immer 1 sein.
Betrachten Sie beispielsweise
v = [1, -2]
. Dannsum(v) = -1
.Oder vielleicht
sum
ist die Funktion, die du suchst, aber es funktioniert nicht mathematisch zu qualifizieren, als eine norm, weil eine norm ist eine Funktion, weist eine streng positive Länge oder Größe, um alle Vektoren in einem Vektorraum.Im obigen Beispiel
sum(v)
negativ ist.Können Sie wählen, entweder:
sum(x)
, die erfüllt beide Anforderungen, aber nicht qualifizieren sich als norm Funktion, da es nachgeben können negative Werte.norm(x, 1)
als OleThomsenBuus vorgeschlagen, die tatsächlich berechnetsum(abs(x(:)))
.Es wird nicht das erfüllen beide deine Anforderungen, es sei denn, Sie beschränken Ihre Vektorraum nicht-negativen Vektoren.
InformationsquelleAutor Eitan T
Was Sie tun müssen, ist, glaube ich, normalisieren mit der 1-norm (Taxi-norm):
Variable
v_normed
sollte jetzt[0.4, 0.4, 0.2, 0.0]
. Die 1-norm vonv_normed
wird gleich 1 ist. Sie können auch die Summe der Vektor (ähnlich wie die 1-norm, aber ohne die absolute Funktion auf jeden Wert), aber die Reichweite, die Summe wird zwischen -1 und + 1 im Allgemeinen Fall (wenn keine Werte inv
sind unter 0). Könnten Sieabs
auf die resultierende Summe, aber mathematisch ist es nicht mehr qualifizieren als eine norm.abs
benötigt wird.Besser? Danke btw.
Wie ich bereits in meiner Antwort, es immer noch nicht erfüllen, die OP ist zwei Anforderungen für alle - Vektoren, aber es ist zumindest mathematisch qualifiziert sich als eine norm.
InformationsquelleAutor Ole Thomsen Buus
Wenn es keine weitere Bedingungen zu Ihrer Normalisierung, als Sie Gaben zu Beginn Ihre Frage, eine mögliche Lösung wäre
sum(v)
nicht mathematisch zu qualifizieren, als ein norm, weil es nachgeben können negative Werte.Nicht erfüllen die Anforderung der alle Werte zwischen 0 und 1 (wenn man auch negative Elemente).
Ich bin damit einverstanden. Ich sollte nicht mit der "Normalisierung" anstelle von "norm", wie der OP. Werde ich Bearbeiten, meine Antwort entsprechend.
es gibt keine Notwendigkeit für Punkt in
./
Das ist richtig. Noch halte ich es für eine gute Praxis zu verwenden
.
wenn die Anwendung der skalaren operators auf einen Vektor, denn es macht den code unambigous.InformationsquelleAutor Deve