Main Content

svd

설명

예제

S = svd(A)는 행렬 A특이값을 내림차순으로 반환합니다.

예제

[U,S,V] = svd(A)A = U*S*V'를 충족하는 행렬 A의 특이값 분해를 수행합니다.

예제

[___] = svd(A,"econ")은 위에 열거된 출력 인수 조합 중 하나를 사용하여 A의 효율적인 크기의 분해를 생성합니다. Am×n 행렬인 경우 다음과 같습니다.

  • m > nU의 처음 n개 열만 계산되고, Sn×n이 됩니다.

  • m = nsvd(A,"econ")svd(A)와 동일합니다.

  • m < nV의 처음 m개 열만 계산되고, Sm×m이 됩니다.

효율적 크기의 분해는 특이값으로 구성된 대각 행렬 S에서 0으로 이루어진 추가 행 또는 열을 제거하며 표현식 A = U*S*V'에서 이러한 0과 곱해질 U 또는 V의 열도 제거합니다. 이러한 0과 열을 제거하면 분해의 정확도에 영향을 미치지 않으면서 실행 시간을 개선하고 필요한 저장 공간을 줄일 수 있습니다.

예제

[___] = svd(A,0)m×n 행렬 A에 대해 다음과 같이 다른 효율적 크기의 분해를 생성합니다.

  • m > nsvd(A,0)svd(A,"econ")과 동일합니다.

  • m <= nsvd(A,0)svd(A)와 동일합니다.

이 구문의 사용은 권장되지 않습니다. "econ" 옵션을 대신 사용하십시오.

[___] = svd(___,outputForm)은 선택적으로 특이값의 출력 형식을 지정합니다. 위에 열거된 입력 인수 또는 출력 인수 조합과 함께 이 옵션을 사용할 수 있습니다. 특이값을 열 벡터로 반환하려면 "vector"를 지정하고, 특이값을 대각 행렬로 반환하려면 "matrix"를 지정합니다.

예제

모두 축소

완전 랭크 행렬의 특이값을 계산합니다.

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

사각 행렬 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

기계 정밀도 내에서 관계 A = U*S*V'를 확인합니다.

U*S*V'
ans = 4×2

    1.0000    2.0000
    3.0000    4.0000
    5.0000    6.0000
    7.0000    8.0000

사각 행렬의 완전 분해와 효율적 크기의 분해를 계산합니다.

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

A는 4×2이므로, svd(A,"econ")은 완전 분해와 비교하여 더 적은 열의 U와 더 적은 행의 S를 반환합니다. S에서 0으로 이루어진 추가 행이 제외되었고 표현식 A = U*S*V'에서 이러한 0과 곱해질 U의 열도 제외되었습니다.

6×6 마방진 행렬을 만들고 SVD를 계산합니다. 기본적으로 svd는 여러 개의 출력값을 지정하면 특이값을 대각 행렬로 반환합니다.

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

"vector" 옵션을 지정하여 특이값을 열 벡터로 반환합니다.

[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

S = svd(A)처럼 한 개의 출력 인수를 지정하면 svd는 특이값을 기본적으로 열 벡터로 반환하는 동작으로 전환됩니다. 이 경우, "matrix" 옵션을 지정하면 특이값을 대각 행렬로 반환할 수 있습니다.

특이값 분해의 결과를 사용하여 행렬의 랭크, 열 공간, 영공간을 확인합니다.

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

0이 아닌 특이값의 개수를 사용하여 랭크를 계산합니다.

s = diag(S);
rank_A = nnz(s)
rank_A = 2

0이 아닌 특이값에 대응하는 U의 열들을 사용하여 A의 열 공간에 대한 정규 직교 기저를 계산합니다.

column_basis = U(:,logical(s))
column_basis = 3×2

     1     0
     0     1
     0     0

0과 같은 특이값에 대응하는 V의 열들을 사용하여 A의 영공간에 대한 정규 직교 기저를 계산합니다.

null_basis = V(:,~s)
null_basis = 3×1

   -0.7071
         0
    0.7071

함수 rank, orth, null을 사용하면 이러한 수량을 편리하게 계산할 수 있습니다.

입력 인수

모두 축소

입력 행렬입니다. A는 정사각 행렬이나 직사각 행렬일 수 있습니다.

데이터형: single | double
복소수 지원 여부:

특이값의 출력 형식으로, 다음 값 중 하나로 지정됩니다.

  • "vector"S는 열 벡터입니다. 이는 하나의 출력값 S = svd(X)를 지정할 때의 디폴트 동작입니다.

  • "matrix"S는 대각 행렬입니다. 이는 여러 출력값 [U,S,V] = svd(X)를 지정할 때의 디폴트 동작입니다.

예: [U,S,V] = svd(X,"vector")는 대각 행렬 대신 열 벡터로 S를 반환합니다.

예: S = svd(X,"matrix")는 열 벡터 대신 대각 행렬로 S를 반환합니다.

데이터형: char | string

출력 인수

모두 축소

좌측 특이 벡터로, 행렬의 열로 반환됩니다.

  • m > nm×n 행렬 A의 경우, 효율적 크기의 분해 svd(A,"econ")U의 처음 n개 열만 계산합니다. 이 경우, U의 열은 직교 상태이고 UUHU=In을 충족하는 m×n 행렬입니다.

  • 완전 분해의 경우, svd(A)UUUH=UHU=Im을 충족하는 m×m 유니타리 행렬로 반환합니다. 0이 아닌 특이값에 해당하는 U의 열들이 A의 치역에 대한 정규 직교 기저 벡터 집합을 구성합니다.

컴퓨터와 MATLAB®의 릴리스에 따라 각기 다른 특이 벡터가 생성될 수 있으나, 수치적으로는 다 정확합니다. UV에서 서로 대응하는 열은 부호를 뒤집을 수 있으며, 이렇게 해도 표현식 A = U*S*V'의 값에는 영향을 미치지 않습니다.

특이값으로, 대각 행렬 또는 열 벡터로 반환됩니다. 특이값은 음이 아니며, 내림차순으로 반환됩니다.

Am×n 행렬이고 S가 대각 행렬이면 S의 크기는 다음과 같습니다.

  • 효율적 크기의 분해 svd(A,"econ")Smin([m,n])차 정사각 행렬로 반환합니다.

  • 완전 분해의 경우, svd(A)A와 동일한 크기의 S를 반환합니다.

또한 S의 특이값은 svd 호출 방법과 outputForm 옵션의 지정 여부에 따라 열 벡터 또는 대각 행렬로 반환됩니다.

  • 하나의 출력값을 갖는 svd를 호출하거나 "vector" 옵션을 지정하면 S는 열 벡터입니다.

  • 여러 출력값을 갖는 svd를 호출하거나 "matrix" 옵션을 지정하면 S는 대각 행렬입니다.

출력값을 하나를 지정했는지 아니면 여러 개를 지정했는지에 따라 svd는 각기 다른 특이값을 반환할 수 있으나, 수치적으로는 다 정확합니다.

우측 특이 벡터로, 행렬의 열로 반환됩니다.

  • m < nm×n 행렬 A의 경우, 효율적 크기의 분해 svd(A,"econ")V의 처음 m개 열만 계산합니다. 이 경우, V의 열은 직교 상태이고 VVHV=Im을 충족하는 n×m 행렬입니다.

  • 완전 분해의 경우, svd(A)VVVH=VHV=In을 충족하는 n×n 유니타리 행렬로 반환합니다. 0이 아닌 특이값에 해당하지 않는 V의 열들이 A의 영공간에 대한 정규 직교 기저 벡터 집합을 구성합니다.

컴퓨터와 MATLAB의 릴리스에 따라 각기 다른 특이 벡터가 생성될 수 있으나, 수치적으로는 다 정확합니다. UV에서 서로 대응하는 열은 부호를 뒤집을 수 있으며, 이렇게 해도 표현식 A = U*S*V'의 값에는 영향을 미치지 않습니다.

확장 기능

버전 내역

R2006a 이전에 개발됨

모두 확장

참고 항목

| | | | | | |

도움말 항목