2012-06-27 24 views
8

Ho bisogno di normalizzare un vettore di N interi in modo che:Come dovrei normalizzare un vettore in Matlab dove la somma è 1?

  • Ogni valore è proporzionale al valore originale (il valore sarà compreso tra 0 e 1)
  • La somma di tutti i valori è = 1

Per esempio:

Se ho un vettore

V = [2,2,1,0] 

il vettore normalizzato dovrebbe dovrebbe essere:

V_norm = [0.4,0.4,0.2,0] % 0.4+0.4+0.2 = 1 

ho provato con tante soluzioni trovate in questa comunità e sul web e, infine, l'ho fatto con questo codice:

part = norm(V); 
if part > 0 
    V_norm = V/part; 
else % part = 0 --> avoid "divide by 0" 
    V_norm = part; 
end 

Il problema questo funziona se :

  • tutti gli elementi della matrice sono "0" -> array risultante non cambia
  • solo elemento della arra y è> 0 e tutti gli altri elementi sono = 0 -> array risultante: l'elemento> 0 è 1 e l'altra 0

ma se ho un altro caso, anche se il risultato è proporzionale, la somma è non 0. Per esempio:

V = [1,0,1] 
    V_norm = [0.74,0,0.74] 

    V = [1,1,1] 
    V_norm = [0.54,0.54,0.54] 

(non sono sicuro se il numero è corretto, perché non posso usare Matlab in questo momento, ma sono sicuro che la somma è> 1)

Ahy suggerimento?

Grazie in anticipo

risposta

8

... il vettore normalizzato dovrebbe dovrebbe essere:

v_norm = [0.4, 0.4, 0.2, 0]; % 0.4+0.4+0.2 = 1

Dipende. Qual è la tua funzione norm?

norm(x) in MATLAB restituisce la norma standard, vale a dire la somma dei quadrati degli elementi di un vettore normalizzato x è 1.

Nel tuo esempio:

v = [1, 1, 1];   %# norm(v) = sqrt(1^2+1^2+1^2) = ~1.7321 
v_norm = v/norm(v); %# v_norm = [0.5574, 0.5574, 0.5574] 

sum(v_norm .^ 2) infatti rendimenti 1, ma sum(v_norm) non, come previsto.


Ho bisogno di normalizzare un vettore di N interi in modo che ogni valore è proporzionale al valore originale (il valore sarà compreso tra 0 e 1) e la somma di tutti i valori è 1.

Che cosa si intende per "normalizzare "? Significa dividere per un valore che è una funzione di norma matematica valida, secondo lo norm definition?

Cosa intendi per "proporzionale"? Questo implica che tutti gli elementi sono moltiplicati per quello stesso numero? Se lo fa, ed è una norma matematica valida, non è possibile garantire che la somma degli elementi sarà sempre 1.
Ad esempio, considerare v = [1, -2]. Quindi sum(v) = -1.

O forse sum è la funzione che stai cercando, ma non è così matematicamente qualificano come una norma, perché una norma è una funzione che assegna una lunghezza strettamente positiva o dimensione per tutti i vettori in uno spazio vettoriale .
Nell'esempio sopra, sum(v) è negativo.


Ahy suggerimento?

È possibile scegliere tra:

  1. sum(x), che soddisfa entrambi i requisiti, ma non si qualifica come una funzione norma dal momento che può dar luogo a valori negativi.
  2. norm(x, 1), come suggerito da OleThomsenBuus, che calcola effettivamente sum(abs(x(:))).
    Non soddisferà entrambi i requisiti, a meno che non si limiti lo spazio vettoriale a vettori non negativi.
6

Se non ci sono le condizioni furhter al tuo normalizzazione che avete dato agli inizi della tua domanda, una possibile soluzione sarebbe

V = [3 4 -2]; 
S = sum(V); 
if (S == 0) 
    % no solution 
else 
    V_norm = V ./ S; 
end 
sum(V_norm) 
+0

Come un sidenote, 'sum (v)' non può qualificarsi matematicamente come [norma] (http://en.wikipedia.org/wiki/Norm_ (matematica)) perché può produrre valori negativi. –

+0

Non soddisfa il requisito che tutti i valori siano compresi tra 0 e 1 (considerando gli elementi negativi). – Tobold

+0

Sono d'accordo. Non avrei dovuto usare la "normalizzazione" invece di "norma", come ha fatto l'OP. Modificherò la mia risposta di conseguenza. – Deve

9

Quello che dovete fare è, io credo, normalizzare utilizzando la (norma taxi) 1-norm:

v = [2, 2, 1, 0]; 
v_normed = v/norm(v, 1); % using the 1-norm 

variabile v_normed dovrebbe ora essere [0.4, 0.4, 0.2, 0.0]. La norma 1 di v_normed sarà uguale a 1. È inoltre possibile sommare il vettore (simile alla norma 1, ma senza applicare la funzione assoluta a ciascun valore), ma l'intervallo di tale somma sarà compreso tra -1 e 1 nel caso generale (se qualsiasi valore in v è inferiore a 0). È possibile utilizzare abs sulla somma risultante, ma matematicamente non sarà più qualificato come norma.

+0

+1: buon suggerimento, ma non penso che sia necessario 'abs'. –

+0

Meglio? Grazie a tutti –

+0

Come ho affermato nella mia risposta, non soddisfa ancora i due requisiti dell'OP per tutti i vettori, ma almeno si qualifica matematicamente come norma. –

Problemi correlati