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 primerasn
columnas deU
, yS
es den
porn
.m = n
:svd(A,"econ")
equivale asvd(A)
.m < n
: solo se calculan las primerasm
columnas deV
, yS
es dem
porm
.
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"
:S
es un vector columna. Este es el comportamiento predeterminado cuando se especifica una salida,S = svd(X)
."matrix"
:S
es 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
m
porn
A
conm > n
, la descomposición de tamaño parcialsvd(A,"econ")
calcula solo las primerasn
columnas deU
. En este caso, las columnas deU
son ortogonales yU
es una matriz dem
porn
que cumple .Para descomposiciones completas,
svd(A)
devuelveU
como una matriz unitaria dem
porm
que cumple . Las columnas deU
que 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 devuelveS
como una matriz cuadrada de ordenmin([m,n])
.Para descomposiciones completas,
svd(A)
devuelveS
con 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
svd
con una salida o especifica la opción"vector"
,S
es un vector columna.Si llama a
svd
con varias salidas o especifica la opción"matrix"
,S
es 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
m
porn
A
conm < n
, la descomposición parcialsvd(A,"econ")
calcula solo las primerasm
columnas deV
. En este caso, las columnas deV
son ortogonales yV
es una matriz den
porm
que cumple .Para descomposiciones completas,
svd(A)
devuelveV
como una matriz unitaria den
porn
que cumple . Las columnas deV
que 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
SVD
diferente 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
SVD
diferente 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
A
es 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)