Quando si chiama norm
su una matrice in MATLAB, restituisce quella che è nota come "norma di matrice" (un valore scalare) anziché una matrice di norme vettoriali. Esiste un modo per ottenere la norma di ciascun vettore in una matrice senza il looping e sfruttando la vettorizzazione di MATLAB?Norma vettoriale di una matrice di vettori in MATLAB
risposta
È possibile calcolare autonomamente la norma di ogni colonna o riga di una matrice utilizzando element-wise arithmetic operators e le funzioni definite per operare su determinate dimensioni di matrice (come SUM e MAX). Ecco come si potrebbe calcolare alcune norme colonna-saggio per una matrice M
:
twoNorm = sqrt(sum(abs(M).^2,1)); %# The two-norm of each column
pNorm = sum(abs(M).^p,1).^(1/p); %# The p-norm of each column (define p first)
infNorm = max(M,[],1); %# The infinity norm (max value) of each column
Queste norme possono facilmente essere fatto per operare sulle righe invece delle colonne modificando gli argomenti dimensione da ...,1
a ...,2
.
forse dovresti specificare in modo esplicito le dimensioni lungo le quali funzionano SUM e MAX, in questo modo sarebbe più semplice passare a regole di riga ... – Amro
@Amro: buon suggerimento. Fatto! – gnovice
Se 'M' consiste solo di numeri reali, è possibile sostituire' abs (M) 'con' M' nel 'dueNorm' poichè il'.^2' cancella efficacemente qualsiasi segno negativo. – kroimon
L'implementazione esistente per la due-norma può essere migliorata.
twoNorm = sqrt(sum(abs(M).^2,1)); # The two-norm of each column
abs(M).^2
sta per essere il calcolo di un intero gruppo di inutili radici quadrate che solo ottenere immediatamente quadrato.
Molto meglio fare:
twoNorm = sqrt(
sum(real(M .* conj(M)), 1)
)
Questo gestisce in modo efficiente reale e complessa M.
Utilizzando real()
assicura che sum
e sqrt
agire su numeri reali (piuttosto che i numeri complessi con 0 componente immaginaria).
Dalla versione 2017 in poi, è possibile utilizzare vecnorm.
che dire di somma? –