이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
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
— 입력 행렬
행렬
입력 행렬입니다. A
는 정사각 행렬이나 직사각 행렬일 수 있습니다.
데이터형: single
| double
복소수 지원 여부: 예
outputForm
— 특이값 출력 형식
"vector"
| "matrix"
특이값의 출력 형식으로, 다음 값 중 하나로 지정됩니다.
"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
출력 인수
U
— 좌측 특이 벡터
행렬
좌측 특이 벡터로, 행렬의 열로 반환됩니다.
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'
의 값에는 영향을 미치지 않습니다.
S
— 특이값
대각 행렬 | 열 벡터
특이값으로, 대각 행렬 또는 열 벡터로 반환됩니다. 특이값은 음이 아니며, 내림차순으로 반환됩니다.
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
는 각기 다른 특이값을 반환할 수 있으나, 수치적으로는 다 정확합니다.
V
— 우측 특이 벡터
행렬
우측 특이 벡터로, 행렬의 열로 반환됩니다.
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'
의 값에는 영향을 미치지 않습니다.
확장 기능
tall형 배열
메모리에 담을 수 없을 정도로 많은 행을 가진 배열을 계산할 수 있습니다.
사용법 관련 참고 및 제한 사항:
3-출력 구문
[U,S,V] = svd(X)
는 지원되지 않습니다. 출력값 3개를 사용하려면svd(X,"econ")
을 지정해야 하고 선택적으로"vector"
또는"matrix"
옵션을 지정할 수 있습니다.출력값이
s = svd(X,...)일 때,
"econ"
을 지정하지 않는 한 특이값은 벡터로 반환되어야 합니다.
자세한 내용은 tall형 배열 항목을 참조하십시오.
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
코드 생성에는 MATLAB이 사용하는 것과 다른
SVD
구현이 사용됩니다. 특이값 분해가 고유하지 않기 때문에 좌측 특이 벡터와 우측 특이 벡터가 MATLAB이 계산한 벡터와 다를 수 있습니다.코드 생성 시 이 함수에 대해 희소 행렬 입력값은 지원되지 않습니다.
GPU 코드 생성
GPU Coder™를 사용하여 NVIDIA® GPU용 CUDA® 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
코드 생성에는 MATLAB이 사용하는 것과 다른
SVD
구현이 사용됩니다. 특이값 분해가 고유하지 않기 때문에 좌측 특이 벡터와 우측 특이 벡터가 MATLAB이 계산한 벡터와 다를 수 있습니다.입력 행렬에 무한 값이 포함되어 있는 경우 생성된 코드는 오류를 발생시키지 않습니다. 대신, 출력값에
NaN
값이 포함됩니다.코드 생성 시 이 함수에 대해 희소 행렬 입력값은 지원되지 않습니다.
스레드 기반 환경
MATLAB®의 backgroundPool
을 사용해 백그라운드에서 코드를 실행하거나 Parallel Computing Toolbox™의 ThreadPool
을 사용해 코드 실행 속도를 높일 수 있습니다.
이 함수는 스레드 기반 환경을 완전히 지원합니다. 자세한 내용은 스레드 기반 환경에서 MATLAB 함수 실행하기 항목을 참조하십시오.
GPU 배열
Parallel Computing Toolbox™를 사용해 GPU(그래픽스 처리 장치)에서 실행하여 코드 실행 속도를 높일 수 있습니다.
svd
함수는 GPU 배열을 완전히 지원합니다. GPU에서 이 함수를 실행하려면 입력 데이터를 gpuArray
(Parallel Computing Toolbox)로 지정하십시오. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 (Parallel Computing Toolbox) 항목을 참조하십시오.
분산 배열
Parallel Computing Toolbox™를 사용하여 대규모 배열을 클러스터의 결합된 메모리에 걸쳐 분할할 수 있습니다.
사용법 관련 참고 및 제한 사항:
입력 행렬
A
가 사각형인 경우"econ"
옵션을 사용하여 효율적 크기의 분해를 지정해야 합니다.
자세한 내용은 분산 배열을 사용하여 MATLAB 함수 실행 (Parallel Computing Toolbox) 항목을 참조하십시오.
버전 내역
R2006a 이전에 개발됨R2022b: "0" 구문은 효율적 크기의 분해에 권장되지 않음
구문 [___] = svd(A,0)
은 계속 지원되지만 더 이상 권장되지 않습니다. 효율적 크기의 분해를 수행하려면 "econ"
옵션을 대신 사용합니다.
R2021b: 출력 형식 지정
svd
가 출력 인수를 벡터 또는 행렬로 반환할지 제어하려면 outputForm
을 "vector"
또는 "matrix"
로 지정하십시오. 대규모 분해에서는 출력값을 벡터로 반환하면 메모리가 절약되고 효율성이 개선될 수 있습니다.
R2021b: svd
는 유한하지 않은 입력값에 대해 NaN
을 반환함
입력값에 유한하지 않은 값(Inf
또는 NaN
)이 포함되어 있을 때 svd
는 NaN
값을 반환합니다. 이전에는 svd
는 입력값에 유한하지 않은 값이 포함되어 있을 때 오류를 발생시켰습니다.
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)