svd
Descomposición en valores singulares
Descripción
devuelve los valores singulares de la matriz S = svd(A)A en orden descendente.
[___] = svd( produce una descomposición de tamaño parcial de A,"econ")A utilizando cualquiera de las combinaciones de argumentos de salida anteriores. Si A es una matriz de m por n:
m > n: solo se calculan las primerasncolumnas deU, ySes denporn.m = n:svd(A,"econ")equivale asvd(A).m < n: solo se calculan las primerasmcolumnas deV, ySes demporm.
La descomposición de tamaño parcial elimina las filas o columnas adicionales de ceros de la matriz diagonal de valores singulares, S, junto con las columnas en U o V que multiplican esos ceros en la expresión A = U*S*V'. La eliminación de estos ceros y columnas puede mejorar el tiempo de ejecución y reducir los requisitos de almacenamiento sin comprometer la precisión de la descomposición.
[___] = svd( produce una descomposición diferente de tamaño parcial de la matriz de A,0)m por n A:
m > n:svd(A,0)equivale asvd(A,"econ").m <= n:svd(A,0)equivale asvd(A).
No se recomienda el uso de esta sintaxis. Utilice la opción "econ" en su lugar.
[___] = svd(___, especifica de forma opcional el formato de salida de los valores singulares. Puede utilizar esta opción con cualquiera de las combinaciones de argumentos de entrada o salida anteriores. Especifique outputForm)"vector" para devolver los valores singulares como un vector columna, o "matrix" para devolver los valores singulares en una matriz diagonal.
Ejemplos
Calcule los valores singulares de una matriz de rango completo.
A = [1 0 1; -1 -2 0; 0 1 -1]
A = 3×3
1 0 1
-1 -2 0
0 1 -1
s = svd(A)
s = 3×1
2.4605
1.6996
0.2391
Encuentre la descomposición en valores singulares de una matriz rectangular A.
A = [1 2; 3 4; 5 6; 7 8]
A = 4×2
1 2
3 4
5 6
7 8
[U,S,V] = svd(A)
U = 4×4
-0.1525 -0.8226 -0.3945 -0.3800
-0.3499 -0.4214 0.2428 0.8007
-0.5474 -0.0201 0.6979 -0.4614
-0.7448 0.3812 -0.5462 0.0407
S = 4×2
14.2691 0
0 0.6268
0 0
0 0
V = 2×2
-0.6414 0.7672
-0.7672 -0.6414
Confirme la relación A = U*S*V', dentro de la precisión de la máquina.
U*S*V'
ans = 4×2
1.0000 2.0000
3.0000 4.0000
5.0000 6.0000
7.0000 8.0000
Calcule la descomposición completa y la parcial de una matriz rectangular.
A = [1 2; 3 4; 5 6; 7 8]
A = 4×2
1 2
3 4
5 6
7 8
[U,S,V] = svd(A)
U = 4×4
-0.1525 -0.8226 -0.3945 -0.3800
-0.3499 -0.4214 0.2428 0.8007
-0.5474 -0.0201 0.6979 -0.4614
-0.7448 0.3812 -0.5462 0.0407
S = 4×2
14.2691 0
0 0.6268
0 0
0 0
V = 2×2
-0.6414 0.7672
-0.7672 -0.6414
[U,S,V] = svd(A,"econ")U = 4×2
-0.1525 -0.8226
-0.3499 -0.4214
-0.5474 -0.0201
-0.7448 0.3812
S = 2×2
14.2691 0
0 0.6268
V = 2×2
-0.6414 0.7672
-0.7672 -0.6414
Dado que A es de 4 por 2, svd(A,"econ") devuelve menos columnas en U y menos filas en S en comparación con una descomposición completa. Se excluyen las filas adicionales de ceros en S, junto con las columnas correspondientes en U que se multiplicarían con esos ceros en la expresión A = U*S*V'.
Cree una matriz del cuadrado mágico de 6 por 6 y calcule la SVD. De forma predeterminada, svd devuelve los valores singulares en una matriz diagonal cuando se especifican varias salidas.
A = magic(6); [U,S,V] = svd(A)
U = 6×6
-0.4082 0.5574 0.0456 -0.4182 0.3092 0.5000
-0.4082 -0.2312 0.6301 -0.2571 -0.5627 0.0000
-0.4082 0.4362 0.2696 0.5391 0.1725 -0.5000
-0.4082 -0.3954 -0.2422 -0.4590 0.3971 -0.5000
-0.4082 0.1496 -0.6849 0.0969 -0.5766 0.0000
-0.4082 -0.5166 -0.0182 0.4983 0.2604 0.5000
S = 6×6
111.0000 0 0 0 0 0
0 50.6802 0 0 0 0
0 0 34.3839 0 0 0
0 0 0 10.1449 0 0
0 0 0 0 5.5985 0
0 0 0 0 0 0.0000
V = 6×6
-0.4082 0.6234 -0.3116 0.2495 0.2511 0.4714
-0.4082 -0.6282 0.3425 0.1753 0.2617 0.4714
-0.4082 -0.4014 -0.7732 -0.0621 -0.1225 -0.2357
-0.4082 0.1498 0.2262 -0.4510 0.5780 -0.4714
-0.4082 0.1163 0.2996 0.6340 -0.3255 -0.4714
-0.4082 0.1401 0.2166 -0.5457 -0.6430 0.2357
Especifique la opción "vector" para devolver los valores singulares en un vector columna.
[U,S,V] = svd(A,"vector")U = 6×6
-0.4082 0.5574 0.0456 -0.4182 0.3092 0.5000
-0.4082 -0.2312 0.6301 -0.2571 -0.5627 0.0000
-0.4082 0.4362 0.2696 0.5391 0.1725 -0.5000
-0.4082 -0.3954 -0.2422 -0.4590 0.3971 -0.5000
-0.4082 0.1496 -0.6849 0.0969 -0.5766 0.0000
-0.4082 -0.5166 -0.0182 0.4983 0.2604 0.5000
S = 6×1
111.0000
50.6802
34.3839
10.1449
5.5985
0.0000
V = 6×6
-0.4082 0.6234 -0.3116 0.2495 0.2511 0.4714
-0.4082 -0.6282 0.3425 0.1753 0.2617 0.4714
-0.4082 -0.4014 -0.7732 -0.0621 -0.1225 -0.2357
-0.4082 0.1498 0.2262 -0.4510 0.5780 -0.4714
-0.4082 0.1163 0.2996 0.6340 -0.3255 -0.4714
-0.4082 0.1401 0.2166 -0.5457 -0.6430 0.2357
Si especifica un argumento de salida, como S = svd(A), svd cambia de comportamiento para devolver los valores singulares en un vector columna de forma predeterminada. En ese caso, puede especificar la opción "matrix" para devolver los valores singulares como una matriz diagonal.
Utilice los resultados de la descomposición en valores singulares para determinar el rango, el espacio de columnas y el espacio nulo de una matriz.
A = [2 0 2; 0 1 0; 0 0 0]
A = 3×3
2 0 2
0 1 0
0 0 0
[U,S,V] = svd(A)
U = 3×3
1 0 0
0 1 0
0 0 1
S = 3×3
2.8284 0 0
0 1.0000 0
0 0 0
V = 3×3
0.7071 0 0.7071
0 1.0000 0
0.7071 0 -0.7071
Calcule el rango utilizando el número de valores singulares distintos de cero.
s = diag(S); rank_A = nnz(s)
rank_A = 2
Calcule una base ortonormal para el espacio de columnas de A utilizando las columnas de U que correspondan a valores singulares distintos de cero.
column_basis = U(:,logical(s))
column_basis = 3×2
1 0
0 1
0 0
Calcule una base ortonormal para el espacio nulo de A utilizando las columnas de V que correspondan a valores singulares iguales a cero.
null_basis = V(:,~s)
null_basis = 3×1
0.7071
0
-0.7071
Las funciones rank, orth y null permiten calcular fácilmente estas cantidades.
Argumentos de entrada
Matriz de entrada. A puede tener un tamaño cuadrado o rectangular.
Tipos de datos: single | double
Soporte de números complejos: Sí
Formato de salida de los valores singulares, especificado como uno de estos valores:
"vector":Ses un vector columna. Este es el comportamiento predeterminado cuando se especifica una salida,S = svd(X)."matrix":Ses una matriz diagonal. Este es el comportamiento predeterminado cuando se especifican varias salidas,[U,S,V] = svd(X).
Ejemplo: [U,S,V] = svd(X,"vector") devuelve S como un vector columna en lugar de una matriz diagonal.
Ejemplo: S = svd(X,"matrix") devuelve S como una matriz diagonal en lugar de un vector columna.
Tipos de datos: char | string
Argumentos de salida
Vectores singulares izquierdos, devueltos como columnas de una matriz.
Para una matriz de
mpornAconm > n, la descomposición de tamaño parcialsvd(A,"econ")calcula solo las primerasncolumnas deU. En este caso, las columnas deUson ortogonales yUes una matriz dempornque cumple .Para descomposiciones completas,
svd(A)devuelveUcomo una matriz unitaria dempormque cumple . Las columnas deUque corresponden a valores singulares distintos de cero forman un conjunto de vectores de base ortonormal para el rango deA.
Distintas máquinas y versiones de MATLAB® pueden producir diferentes vectores singulares que siguen siendo numéricamente precisos. Las columnas correspondientes en U y V pueden invertir sus signos, ya que esto no afecta al valor de la expresión A = U*S*V'.
Valores singulares, devueltos como una matriz diagonal o un vector columna. Los valores singulares no son negativos y se devuelven en orden decreciente.
Si A es una matriz de m por n y S es una matriz diagonal, el tamaño de S es el siguiente:
La descomposición
svd(A,"econ")de tamaño parcial devuelveScomo una matriz cuadrada de ordenmin([m,n]).Para descomposiciones completas,
svd(A)devuelveScon el mismo tamaño queA.
Además, los valores singulares de S se devuelven en un vector columna o una matriz diagonal dependiendo de cómo llame a svd y de si especifica la opción outputForm:
Si llama a
svdcon una salida o especifica la opción"vector",Ses un vector columna.Si llama a
svdcon varias salidas o especifica la opción"matrix",Ses una matriz diagonal.
Dependiendo de si especifica una o varias salidas, svd puede devolver diferentes valores singulares que siguen siendo numéricamente precisos.
Vectores singulares derechos, devueltos como columnas de una matriz.
Para una matriz de
mpornAconm < n, la descomposición parcialsvd(A,"econ")calcula solo las primerasmcolumnas deV. En este caso, las columnas deVson ortogonales yVes una matriz denpormque cumple .Para descomposiciones completas,
svd(A)devuelveVcomo una matriz unitaria denpornque cumple . Las columnas deVque no corresponden a valores singulares distintos de cero forman un conjunto de vectores de base ortonormal para el espacio nulo deA.
Distintas máquinas y versiones de MATLAB pueden producir diferentes vectores singulares que siguen siendo numéricamente precisos. Las columnas correspondientes en U y V pueden invertir sus signos, ya que esto no afecta al valor de la expresión A = U*S*V'.
Capacidades ampliadas
La función svd es compatible con arreglos altos con las siguientes notas y limitaciones de uso:
La sintaxis de tres salidas
[U,S,V] = svd(X)no es compatible. Para tres salidas, debe especificarsvd(X,"econ"), y puede especificar opcionalmente las opciones"vector"o"matrix".Con una salida
s = svd(X,...), los valores singulares deben devolverse como un vector a menos que se especifique"econ".
Para obtener más información, consulte Arreglos altos.
Notas y limitaciones de uso:
La generación de código utiliza una implementación de
SVDdiferente a la que usa MATLAB. Como la descomposición del valor singular no es única, los vectores singulares izquierdo y derecho pueden diferir de los que calcula MATLAB.La generación de código no es compatible con entradas de matrices dispersas en esta función.
Notas y limitaciones de uso:
La generación de código utiliza una implementación de
SVDdiferente a la que usa MATLAB. Como la descomposición del valor singular no es única, los vectores singulares izquierdo y derecho pueden diferir de los que calcula MATLAB.Cuando la matriz de entrada contiene un valor no finito, el código generado no emite un error. En vez de eso, la salida contiene valores
NaN.La generación de código no es compatible con entradas de matrices dispersas en esta función.
Esta función es totalmente compatible con entornos basados en subprocesos. Para obtener más información, consulte Ejecutar funciones de MATLAB en entornos basados en subprocesos.
La función svd es totalmente compatible con los arreglos de GPU. Para ejecutar la función en una GPU, especifique los datos de entrada como un gpuArray (Parallel Computing Toolbox). Para obtener más información, consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Notas y limitaciones de uso:
Si la matriz de entrada
Aes rectangular, deberá especificar la descomposición de tamaño parcial con la opción"econ".
Para obtener más información, consulte Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox).
Historial de versiones
Introducido antes de R2006aLa sintaxis [___] = svd(A,0) seguirá siendo compatible, pero ya no se recomienda. Utilice la opción "econ" para realizar descomposiciones de tamaño parcial.
Especifique outputForm como "vector" o "matrix" para controlar si svd devuelve los argumentos de salida como vectores o matrices. Para descomposiciones de gran tamaño, devolver las salidas como vectores puede ahorrar memoria y mejorar la eficiencia.
svd devuelve valores NaN cuando la entrada contiene valores no finitos (Inf o NaN). Anteriormente, svd daba error cuando la entrada contenía valores no finitos.
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Seleccione un país/idioma
Seleccione un país/idioma para obtener contenido traducido, si está disponible, y ver eventos y ofertas de productos y servicios locales. Según su ubicación geográfica, recomendamos que seleccione: .
También puede seleccionar uno de estos países/idiomas:
Cómo obtener el mejor rendimiento
Seleccione China (en idioma chino o inglés) para obtener el mejor rendimiento. Los sitios web de otros países no están optimizados para ser accedidos desde su ubicación geográfica.
América
- América Latina (Español)
- Canada (English)
- United States (English)
Europa
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)