svd
특이값 분해
설명
[___] = svd(은 위에 열거된 출력 인수 조합 중 하나를 사용하여 A,"econ")A의 효율적인 크기의 분해를 생성합니다. A가 m×n 행렬인 경우 다음과 같습니다.
m > n—U의 처음n개 열만 계산되고,S는n×n이 됩니다.m = n—svd(A,"econ")은svd(A)와 동일합니다.m < n—V의 처음m개 열만 계산되고,S는m×m이 됩니다.
효율적 크기의 분해는 특이값으로 구성된 대각 행렬 S에서 0으로 이루어진 추가 행 또는 열을 제거하며 표현식 A = U*S*V'에서 이러한 0과 곱해질 U 또는 V의 열도 제거합니다. 이러한 0과 열을 제거하면 분해의 정확도에 영향을 미치지 않으면서 실행 시간을 개선하고 필요한 저장 공간을 줄일 수 있습니다.
[___] = svd(은 A,0)m×n 행렬 A에 대해 다음과 같이 다른 효율적 크기의 분해를 생성합니다.
m > n—svd(A,0)은svd(A,"econ")과 동일합니다.m <= n—svd(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 > n인m×n행렬A의 경우, 효율적 크기의 분해svd(A,"econ")은U의 처음n개 열만 계산합니다. 이 경우,U의 열은 직교 상태이고U는 을 충족하는m×n행렬입니다.완전 분해의 경우,
svd(A)는U를 을 충족하는m×m유니타리 행렬로 반환합니다. 0이 아닌 특이값에 해당하는U의 열들이A의 치역에 대한 정규 직교 기저 벡터 집합을 구성합니다.
컴퓨터와 MATLAB®의 릴리스에 따라 각기 다른 특이 벡터가 생성될 수 있으나, 수치적으로는 다 정확합니다. U와 V에서 서로 대응하는 열은 부호를 뒤집을 수 있으며, 이렇게 해도 표현식 A = U*S*V'의 값에는 영향을 미치지 않습니다.
특이값으로, 대각 행렬 또는 열 벡터로 반환됩니다. 특이값은 음이 아니며, 내림차순으로 반환됩니다.
A가 m×n 행렬이고 S가 대각 행렬이면 S의 크기는 다음과 같습니다.
효율적 크기의 분해
svd(A,"econ")은S를min([m,n])차 정사각 행렬로 반환합니다.완전 분해의 경우,
svd(A)는A와 동일한 크기의S를 반환합니다.
또한 S의 특이값은 svd 호출 방법과 outputForm 옵션의 지정 여부에 따라 열 벡터 또는 대각 행렬로 반환됩니다.
하나의 출력값을 갖는
svd를 호출하거나"vector"옵션을 지정하면S는 열 벡터입니다.여러 출력값을 갖는
svd를 호출하거나"matrix"옵션을 지정하면S는 대각 행렬입니다.
출력값을 하나를 지정했는지 아니면 여러 개를 지정했는지에 따라 svd는 각기 다른 특이값을 반환할 수 있으나, 수치적으로는 다 정확합니다.
우측 특이 벡터로, 행렬의 열로 반환됩니다.
m < n인m×n행렬A의 경우, 효율적 크기의 분해svd(A,"econ")은V의 처음m개 열만 계산합니다. 이 경우,V의 열은 직교 상태이고V는 을 충족하는n×m행렬입니다.완전 분해의 경우,
svd(A)는V를 을 충족하는n×n유니타리 행렬로 반환합니다. 0이 아닌 특이값에 해당하지 않는V의 열들이A의 영공간에 대한 정규 직교 기저 벡터 집합을 구성합니다.
컴퓨터와 MATLAB의 릴리스에 따라 각기 다른 특이 벡터가 생성될 수 있으나, 수치적으로는 다 정확합니다. U와 V에서 서로 대응하는 열은 부호를 뒤집을 수 있으며, 이렇게 해도 표현식 A = U*S*V'의 값에는 영향을 미치지 않습니다.
확장 기능
svd 함수는 tall형 배열을 지원하지만 다음과 같은 사용법 관련 참고 및 제한 사항이 있습니다.
3-출력 구문
[U,S,V] = svd(X)는 지원되지 않습니다. 출력값 3개를 사용하려면svd(X,"econ")을 지정해야 하고 선택적으로"vector"또는"matrix"옵션을 지정할 수 있습니다.출력값이
s = svd(X,...)일 때,"econ"을 지정하지 않는 한 특이값은 벡터로 반환되어야 합니다.
자세한 내용은 tall형 배열 항목을 참조하십시오.
사용법 관련 참고 및 제한 사항:
코드 생성에는 MATLAB이 사용하는 것과 다른
SVD구현이 사용됩니다. 특이값 분해가 고유하지 않기 때문에 좌측 특이 벡터와 우측 특이 벡터가 MATLAB이 계산한 벡터와 다를 수 있습니다.코드 생성 시 이 함수에 대해 희소 행렬 입력값은 지원되지 않습니다.
사용법 관련 참고 및 제한 사항:
코드 생성에는 MATLAB이 사용하는 것과 다른
SVD구현이 사용됩니다. 특이값 분해가 고유하지 않기 때문에 좌측 특이 벡터와 우측 특이 벡터가 MATLAB이 계산한 벡터와 다를 수 있습니다.입력 행렬에 nonfinite 값이 포함되어 있는 경우 생성된 코드는 오류를 발생시키지 않습니다. 대신, 출력값에
NaN값이 포함됩니다.코드 생성 시 이 함수에 대해 희소 행렬 입력값은 지원되지 않습니다.
이 함수는 스레드 기반 환경을 완전히 지원합니다. 자세한 내용은 스레드 기반 환경에서 MATLAB 함수 실행하기 항목을 참조하십시오.
svd 함수는 GPU 배열을 완전히 지원합니다. GPU에서 이 함수를 실행하려면 입력 데이터를 gpuArray (Parallel Computing Toolbox)로 지정하십시오. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 (Parallel Computing Toolbox) 항목을 참조하십시오.
사용법 관련 참고 및 제한 사항:
입력 행렬
A가 사각형인 경우"econ"옵션을 사용하여 효율적 크기의 분해를 지정해야 합니다.
자세한 내용은 분산 배열을 사용하여 MATLAB 함수 실행 (Parallel Computing Toolbox) 항목을 참조하십시오.
버전 내역
R2006a 이전에 개발됨구문 [___] = svd(A,0)은 계속 지원되지만 더 이상 권장되지 않습니다. 효율적 크기의 분해를 수행하려면 "econ" 옵션을 대신 사용합니다.
svd가 출력 인수를 벡터 또는 행렬로 반환할지 제어하려면 outputForm을 "vector" 또는 "matrix"로 지정하십시오. 대규모 분해에서는 출력값을 벡터로 반환하면 메모리가 절약되고 효율성이 개선될 수 있습니다.
입력값에 nonfinite 값(Inf 또는 NaN)이 포함되어 있을 때 svd는 NaN 값을 반환합니다. 이전에는 svd는 입력값에 nonfinite 값이 포함되어 있을 때 오류를 발생시켰습니다.
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.
웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- 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)