2011-08-26 77 views

Respuesta

24

Puede calcular la norma de cada columna o fila de una matriz usando element-wise arithmetic operators y funciones definidas para operar sobre dimensiones de matrices determinadas (como SUM y MAX). Así es como se podría calcular algunas normas por columnas de una matriz 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 

Estas normas se pueden hacer fácilmente para funcionar en las filas en lugar de las columnas cambiando los argumentos dimensión de ...,1 a ...,2.

+3

tal vez debería especificar explícitamente las dimensiones a lo largo de las cuales funcionan SUM y MAX, de esa manera sería más fácil cambiar a normas de filas ... – Amro

+0

@Amro: Buena sugerencia. ¡Hecho! – gnovice

+2

Si 'M' solo consta de números reales, puede reemplazar' abs (M) 'con' M' en 'twoNorm' ya que'.^2' cancela efectivamente cualquier signo negativo. – kroimon

1

Se puede mejorar la implementación existente para las dos normas.

twoNorm = sqrt(sum(abs(M).^2,1)); # The two-norm of each column 

abs(M).^2 se va a calcular un montón de raíces cuadradas innecesarios que acaba de obtener de inmediato al cuadrado.

mucho mejor hacer:

twoNorm = sqrt( 
       sum(real(M .* conj(M)), 1) 
      ) 

Este gestiona de manera eficaz real y complejo M.

Usando real() asegura que sumsqrt y actúan sobre los números reales (en lugar de los números complejos con 0 componente imaginario).