Main Content

decomposition

선형 시스템을 풀기 위한 행렬 분해

설명

decomposition은 재사용 가능한 행렬 분해(LU, LDL, 촐레스키, QR 등)를 만드는데, 이것을 사용하면 선형 시스템(Ax = b 또는 xA = b)을 더 효율적으로 풀 수 있습니다. 예를 들어, dA = decomposition(A)를 계산하면 호출 dA\bA\b와 동일한 벡터를 반환하는데 일반적으로 훨씬 더 빠릅니다. decomposition 객체를 사용하면 계수 행렬 분해를 여러 번 수행할 필요가 없으므로, 반복적으로 해를 구해야 하는 문제를 풀 때 적합합니다.

원래 계수 행렬 A에 사용할 수 있는 많은 연산자를 decomposition 객체 dA에도 사용할 수 있습니다.

  • 켤레 복소수 전치(Complex Conjugate Transpose) dA'

  • 부정 -dA

  • c*dAdA/c처럼 스칼라로 곱하거나 나누기.

  • x = dA\b를 사용하여 선형 시스템 Ax = b 풀기.

  • x = b/dA를 사용하여 선형 시스템 xA = b 풀기.

생성

설명

예제

dA = decomposition(A)는 선형 시스템을 더 효율적으로 푸는 데 사용할 수 있도록 행렬 A의 분해를 반환합니다. 분해 유형은 입력 행렬의 속성에 기반하여 자동으로 선택됩니다.

예제

dA = decomposition(A,type)은 수행할 분해 유형을 지정합니다. type'qr', 'cod', 'lu', 'ldl', 'chol', 'triangular', 'permutedTriangular', 'banded', 'hessenberg' 또는 'diagonal'이 될 수 있습니다.

예제

dA = decomposition(A,type,triangularFlag)A의 상부 또는 하부 삼각 부분만 분해에 사용됨을 지정합니다. triangularFlag'upper' 또는 'lower'일 수 있습니다. 이 구문에서 분해 유형은 'ldl', 'chol' 또는 'triangular'이어야 합니다.

예제

dA = decomposition(___,Name,Value)는 위에 열거된 구문에 Name,Value 쌍 인수를 하나 이상 추가 옵션으로 지정합니다. 예를 들어, dA = decomposition(A,'CheckCondition',false)dA\b를 푸는 동안 A의 조건을 기준으로 경고를 발생하지 않도록 지정합니다.

입력 인수

모두 확장

계수 행렬입니다. 선형 연립방정식에서 계수 행렬은 Ax = b의 경우처럼 왼쪽에 오거나, xA = b의 경우처럼 오른쪽에 옵니다.

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

분해 유형으로, 다음 표에 나와 있는 옵션 중 하나로 지정됩니다.

이러한 옵션은 어떤 계수 행렬에나 사용할 수 있습니다.

A의 행렬 분해

참고

'auto'(디폴트 값)

N/A

계수 행렬의 속성에 기반하여 행렬 분해 유형을 자동으로 선택합니다. 분해가 선택되는 방식에 대한 내용은 mldivide알고리즘 섹션을 참조하십시오.

'qr'

AP=QR

Q는 유니타리 행렬이고, R은 상부 삼각 행렬이며, P는 치환 행렬입니다.

QR 분해는 최소제곱해를 제공합니다.

type'qr'이면 A'\BB/A를 풀 수 없습니다. 대신 이러한 형식으로 구성된 문제에는 'cod'를 사용하십시오.

'cod'

A=QRZ*

R은 상부 삼각 행렬이고, QZ 모두 정규 직교 열을 가집니다.

완전 직교 분해는 최소 노름 최소제곱해를 제공합니다.

정사각 계수 행렬에는 다음 옵션을 사용할 수도 있습니다.

A의 행렬 분해

참고

'lu'

조밀 행렬:

PA=LU

L은 하부 삼각 행렬이고, U는 상부 삼각 행렬이며, P는 치환 행렬입니다.

희소 행렬:

P(R\A)Q=LU

PQ는 치환 행렬이고 R은 대각 스케일링 행렬입니다.

 

'ldl'

조밀 행렬:

P*AP=LDL*

L은 대각선에 1이 있는 하부 삼각 행렬이고, D는 대각 행렬이며, P는 치환 행렬입니다.

희소 행렬:

P*SASP=LDL*

S는 스케일링 행렬입니다.

A는 대칭 행렬이어야 합니다.

'chol'

조밀 행렬:

A=LL*

L은 하부 삼각 행렬입니다.

희소 행렬:

A=PLL*P*

P는 치환 행렬입니다.

A는 양의 정부호 대칭 행렬이어야 합니다.

'triangular'

A=T

T는 삼각 행렬입니다.

A는 삼각 행렬이어야 합니다.

'permutedTriangular'

A=PTQ*

T는 삼각 행렬이고, PQ는 모두 치환 행렬입니다.

A는 삼각 행렬의 치환 행렬이어야 합니다.

'banded'

A=P*LU

P는 치환 행렬이고 LU는 모두 띠 행렬입니다.

대역폭이 작은 행렬에 가장 효과적입니다. 자세한 내용은 bandwidth를 참조하십시오.

'hessenberg'

A=P*LU

P는 치환 행렬이고, L은 띠 행렬이고, U는 상부 삼각 행렬입니다.

A는 첫 번째 하부대각선 아래에 0을 포함해야 합니다.

'diagonal'

A=D

D는 대각 행렬입니다.

A는 대각 행렬이어야 합니다.

계수 행렬의 상부 삼각 부분만 사용하거나 하부 삼각 부분만 사용하기 위한 플래그로, 'upper' 또는 'lower'로 지정됩니다. 이 옵션은 'triangular', 'chol', 'ldl' 분해 유형을 지원합니다.

  • 'triangular' — 상부와 하부 삼각 행렬이 모두 동일한 행렬에 포함되어 있으면 triangularFlag를 사용하여 두 삼각 행렬 중 하나만 지정하십시오.

  • 'chol''ldl' — 거의 대칭인 계수 행렬의 대칭화를 피하려면 triangularFlag를 사용하십시오.

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: dA = decomposition(A,'qr','CheckCondition',false)A의 QR 분해를 수행하고, 선형 시스템을 풀면서 계수 행렬을 사용할 때 계수 행렬의 조건에 대한 경고를 끕니다.

일반 파라미터

모두 확장

계수 행렬의 조건을 확인하는 토글로, 'CheckCondition'과 함께 논리형 1(true)이나 논리형 0(false)이 쉼표로 구분되어 지정됩니다. CheckConditiontrue이고 계수 행렬의 조건이 나쁘거나 랭크가 낮으면 mldivide (\) 또는 mrdivide (/)를 사용하여 선형 시스템을 풀 때 경고가 생성됩니다.

데이터형: logical

랭크 허용오차로, 음이 아닌 스칼라로 지정됩니다. 허용오차를 지정하면 계수 행렬에서 해의 랜덤 잡음이 발생하지 않게 하는 데 도움이 될 수 있습니다.

decompositionA의 랭크를 QR 분해 [Q,R,p] = qr(A,0)R 행렬에서 tol보다 큰 절댓값을 가진 대각선 요소의 개수로 계산합니다. A의 랭크가 k이면 A의 낮은 랭크 근삿값은 Q의 처음 k 열과 R의 처음 k 행을 곱하여 생성됩니다. 허용오차를 변경하면 A의 낮은 랭크 근삿값이 달라집니다.

참고

이 옵션은 'Type''qr'이나 'cod'일 때 또는 'Type''auto'이고 A가 사각 행렬일 때만 적용됩니다. 그렇지 않은 경우, 이 옵션은 무시됩니다.

희소 행렬 파라미터

모두 확장

대역 밀도 임계값으로, 범위 [0 1]에 있는 스칼라 값으로 지정됩니다. 'BandDensity'의 값은 연립방정식을 풀면서 mldivide (\) 또는 mrdivide (/)에 밴드 솔버가 사용될 때 희소 대역 계수 행렬이 얼마나 조밀해야 하는지를 결정합니다. 계수 행렬의 대역 밀도가 지정된 대역 밀도보다 크면 밴드 솔버가 사용됩니다.

대역 밀도는 (대역에 있는 0이 아닌 요소 개수)/(대역에 있는 요소 개수)로 정의됩니다. 값 1.0은 띠 솔버를 사용하지 않음을 나타냅니다.

LDL 분해의 피벗 허용오차로, 구간 [0 0.5] 사이의 스칼라 값으로 지정됩니다. 더 작은 피벗 허용오차 값을 사용하면 행렬 분해 시간이 빨라지고 요소가 적어질 수 있지만, 행렬 분해의 안정성이 저하될 수도 있습니다.

이 피벗 허용오차는 ldl이 실수 희소 행렬에 사용하는 값과 같습니다.

LU 분해의 피벗 허용오차로, 스칼라 또는 벡터로 지정됩니다. 스칼라 값을 지정하여 허용오차 벡터에서 첫 번째 요소를 변경하거나, 요소 2개를 가진 벡터를 지정하여 두 값을 모두 변경하십시오. 피벗 허용오차 값이 작아지면 LU 인수의 희소성이 더 커지게 되는 경향이 있지만, 해는 부정확해질 수 있습니다. 값이 커지면 항상 그런 것은 아니지만 더 정확한 해를 구할 수 있으며, 대개 전체 작업 및 메모리 사용량이 증가하게 됩니다.

이 피벗 허용오차는 희소 행렬에 대해 lu가 사용하는 값과 같습니다.

속성

모두 확장

읽기 전용 속성입니다.

계수 행렬의 크기로, 요소 2개를 가진 행 벡터로 반환됩니다.

데이터형: double

읽기 전용 속성입니다.

분해 유형으로, 'qr', 'cod', 'lu', 'ldl', 'chol', 'triangular', 'permutedTriangular', 'banded', 'hessenberg' 또는 'diagonal'로 반환됩니다.

데이터형: char

계수 행렬의 조건을 확인하는 토글로, 논리형 1(true) 또는 논리형 0(false)으로 지정됩니다. CheckConditiontrue이고 계수 행렬의 조건이 나쁘거나 랭크가 낮으면 mldivide (\) 또는 mrdivide (/)를 사용하여 선형 시스템을 풀 때 경고가 생성됩니다.

데이터형: logical

읽기 전용 속성입니다.

계수 행렬의 데이터형으로, 'double' 또는 'single'로 반환됩니다.

데이터형: char

읽기 전용 속성입니다.

계수 행렬이 켤레 복소수 전치인지 여부를 나타내는 표시자로, 논리형 1(true) 또는 논리형 0(false)으로 반환됩니다. 계수 행렬에서 생성된 모든 decomposition 객체에 대해 이 표시자는 기본적으로 false입니다. 그러나, dA'\b와 같은 표현식에서 decomposition 객체에 ctranspose 연산자를 사용하는 경우 값은 true입니다. 이 경우, dA'dA와 동일한 decomposition 객체이지만, IsConjugateTransposedtrue 값을 가집니다.

데이터형: logical

읽기 전용 속성입니다.

계수 행렬이 실수 행렬인지 여부를 나타내는 표시자로, 논리형 1(true) 또는 논리형 0(false)으로 반환됩니다. 값 false는 계수 행렬이 복소수를 포함하고 있음을 나타냅니다.

데이터형: logical

읽기 전용 속성입니다.

계수 행렬이 희소 행렬인지 여부를 나타내는 표시자로, 논리형 1(true) 또는 논리형 0(false)으로 반환됩니다.

데이터형: logical

읽기 전용 속성입니다.

계수 행렬의 곱셈 스케일링 인자로, 스칼라로 반환됩니다. 디폴트 값 1은 계수 행렬이 스케일링되지 않음을 나타냅니다. 그런데, decomposition 객체를 스칼라로 곱하거나 나누면 값 ScaleFactor가 변경됩니다. 예를 들어, 3*dAdA와 동일한 decomposition 객체이지만, ScaleFactor 값으로 3을 가집니다.

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

객체 함수

decomposition 객체에 사용할 수 있는 주 함수와 연산자는 선형 연립방정식 풀이와 관계가 있습니다. 분해 유형이 'qr'이면 A'\B 또는 B/A를 풀 수 없습니다. 대신 이러한 형식으로 구성된 문제에는 'cod'를 사용하십시오.

ctranspose켤레 복소수 전치(Complex Conjugate Transpose)
mldividex에 대한 선형 연립방정식 Ax = B의 해 구하기
mrdividex에 대한 선형 연립방정식 xA = B의 해 구하기
isIllConditioned행렬의 조건이 나쁜지 여부 판별

또한 decomposition 객체로 구성된 기본 행렬의 조건수 또는 랭크를 확인할 수 있습니다. 다른 알고리즘이 사용되므로, decomposition 객체에 아래와 같은 함수를 사용하여 얻는 결과가 계수 행렬에 직접 그 함수를 사용하여 얻는 결과와 다를 수 있습니다.

rank
  • 1-입력 형식 rank(dA)만 지원됩니다.

  • 분해 유형은 'qr' 또는 'cod'이어야 합니다.

  • 랭크 값은 RankTolerance(지정된 경우)의 선택사항에 따라 달라집니다.

rcond
  • 백슬래시 \가 경고 발생 여부를 결정하는 데 사용하는 것과 동일한 조건 확인을 실행합니다.

  • 'qr''cod'를 제외한 모든 분해 유형을 지원합니다.

예제

모두 축소

우변 값이 많은 Ax=b의 풀이를 decomposition 객체를 사용하여 얼마나 효율적으로 향상시킬 수 있는지 보여줍니다.

역반복대입법(inverse iteration)은 우변 값이 많은 선형 시스템을 푸는 반복적인 고유값 알고리즘입니다. 이것은 대응하는 고유벡터 추측값에서 시작하여 행렬의 고유값을 반복적으로 계산하는 방법입니다. 반복할 때마다 x = A\x를 계산한 다음, 노름으로 x를 스케일링합니다.

희소 행렬 A와, 임의의 시작 벡터 x1x2를 만듭니다.

n = 1e3;
rng default % for reproducibility
A = sprandn(n,n,0.2) + speye(n);
x1 = randn(n,1);
x2 = x1;

백슬래시를 사용하여 역반복대입법 알고리즘을 100회 반복하여 A의 고유값을 계산합니다.

tic
for ii=1:100
    x1 = A \ x1;
    x1 = x1 / norm(x1);
end
toc
Elapsed time is 20.774384 seconds.
lambda = x1'*A*x1
lambda = -0.6707

이제 decomposition 객체를 사용하여 같은 문제를 풉니다.

tic
dA = decomposition(A); 
for ii=1:100
    x2 = dA \ x2;
    x2 = x2 / norm(x2);
end
toc
Elapsed time is 1.007912 seconds.
lambda = x2'*A*x2
lambda = -0.6707

반복할 때마다 행렬 A를 분해할 필요가 없으므로 알고리즘의 성능이 크게 향상됩니다. 또한 for 루프 전에 A의 LU 분해를 수행하여 백슬래시 알고리즘을 향상시킬 수 있기는 하나, decomposition 객체를 사용하면 복잡한 코드를 작성하지 않고도 모든 성능 이점을 얻을 수 있습니다.

입력 행렬에 기반한 자동 디폴트 선택을 재정의할 분해 유형을 선택하십시오.

계수 행렬을 만들고 디폴트 분해 유형 선택을 사용하여 행렬을 분해합니다.

A = ones(3);
dA = decomposition(A)
dA = 
  decomposition with properties:

    MatrixSize: [3 3]
          Type: 'lu'

  Show all properties

우변의 1로 구성된 벡터를 사용하여 선형 시스템을 풉니다.

b = ones(3,1);
x = dA\b
Warning: Matrix is singular to working precision.
x = 3×1

   NaN
   NaN
   NaN

디폴트 'ldl' 메서드 대신 'qr' 메서드를 사용하도록 분해 유형을 지정하십시오. 이럴 경우 백슬래시(\)는 NaN으로 구성된 벡터를 반환하는 대신 문제에 대한 최소제곱해를 찾습니다.

dA_qr = decomposition(A,'qr')
dA_qr = 
  decomposition with properties:

    MatrixSize: [3 3]
          Type: 'qr'

  Show all properties

x = dA_qr\b
Warning: Rank deficient, rank = 1, tol =  1.153778e-15.
x = 3×1

    1.0000
         0
         0

분해에서 입력 행렬의 상부 삼각 부분만 사용하려면 'upper'를 지정하십시오.

계수 행렬을 만듭니다. 상부 삼각 부분만 사용하여 행렬에 대한 삼각 분해를 생성합니다. 이 옵션은 상부 삼각 행렬과 하부 삼각 행렬이 모두 동일한 행렬에 포함되어 있는 경우 유용할 수 있습니다.

A = randi([0 5],10)
A = 10×10

     4     0     3     4     2     1     4     5     2     0
     5     5     0     0     2     4     1     1     4     0
     0     5     5     1     4     3     3     4     3     3
     5     2     5     0     4     0     4     1     3     4
     3     4     4     0     1     0     5     5     5     5
     0     0     4     4     2     2     5     2     1     0
     1     2     4     4     2     5     3     1     4     3
     3     5     2     1     3     2     0     1     4     2
     5     4     3     5     4     3     0     3     2     0
     5     5     1     0     4     1     1     2     3     2

dA = decomposition(A,'triangular','upper')
dA = 
  decomposition with properties:

    MatrixSize: [10 10]
          Type: 'triangular'

  Show all properties

decomposition을 사용하여 선형 시스템을 풀 때 계수 행렬의 조건에 기반하여 경고를 끄려면 'CheckCondition' 이름-값 쌍을 사용하십시오.

조건이 나쁜 계수 행렬을 만듭니다. 이 행렬의 세 번째 열은 처음 두 열의 평균입니다.

A = [1 2 1.5; 3 4 3.5; 5 6 5.5]
A = 3×3

    1.0000    2.0000    1.5000
    3.0000    4.0000    3.5000
    5.0000    6.0000    5.5000

우변의 1로 구성된 벡터를 사용하여 선형 시스템 Ax=b를 풉니다. mldivide는 계수 행렬의 조건에 대한 경고를 만듭니다.

b = ones(3,1);
x = A\b
Warning: Matrix is singular to working precision.
x = 3×1

   NaN
   Inf
  -Inf

이제 행렬에 대한 decomposition 객체를 만들고 동일한 선형 시스템을 풉니다. 'CheckCondition'false로 지정하여 mldivide가 계수 행렬의 조건을 확인하지 않도록 합니다. 같은 해가 반환되더라도, mldivide는 경고 메시지를 표시하지 않습니다.

dA = decomposition(A,'CheckCondition',false);
x = dA\b
x = 3×1

   NaN
   Inf
  -Inf

isIllConditioned 함수를 사용하여 decomposition 객체가 조건이 나쁜 행렬에 기반하는지 여부를 확인합니다.

tf = isIllConditioned(dA)
tf = logical
   1

참고 문헌

[1] Davis, Timothy A. “Algorithm 930: FACTORIZE: An Object-Oriented Linear System Solver for MATLAB.” ACM Transactions on Mathematical Software 39, no. 4 (July 2013): 1–18. https://doi.org/10.1145/2491491.2491498.

확장 기능

버전 내역

R2017b에 개발됨

참고 항목

| |

도움말 항목