QR 분해는 MATLAB에서 쉽게 수행할 수 있는 행렬 분해 기법 중 하나이다. MATLAB은 수치 해석과 행렬 계산에 특화된 소프트웨어로, 내장 함수들을 통해 효율적이고 간단하게 QR 분해를 구현할 수 있다. 이 장에서는 MATLAB에서 QR 분해를 수행하는 방법과 관련된 다양한 주제들을 다룬다.

기본 사용법

MATLAB에서 QR 분해는 qr 함수를 사용하여 쉽게 수행할 수 있다. 이 함수는 주어진 행렬 \mathbf{A}를 직교 행렬 \mathbf{Q}와 상삼각 행렬 \mathbf{R}로 분해한다. 기본적인 사용법은 다음과 같다.

[Q, R] = qr(A);

여기서 A는 QR 분해를 수행할 원본 행렬이며, Q는 직교 행렬, R은 상삼각 행렬이다. 이 함수는 다음과 같은 과정을 거쳐 결과를 반환한다.

\mathbf{A} = \mathbf{Q} \mathbf{R}

예제: 간단한 QR 분해

다음 예제는 간단한 3 \times 3 행렬에 대해 QR 분해를 수행하는 방법을 보여준다.

A = [1 2 3; 4 5 6; 7 8 9];
[Q, R] = qr(A);

이 코드를 실행하면 \mathbf{Q}\mathbf{R} 행렬이 다음과 같이 계산된다:

\mathbf{Q} = \begin{bmatrix} -0.1231 & 0.9045 & 0.4082 \\ -0.4924 & 0.3015 & -0.8165 \\ -0.8616 & -0.3015 & 0.4082 \end{bmatrix} , \quad \mathbf{R} = \begin{bmatrix} -8.1240 & -9.6011 & -11.0782 \\ 0 & 0.9045 & 1.8090 \\ 0 & 0 & 0 \end{bmatrix}

이 결과에서 \mathbf{Q}는 직교 행렬이고, \mathbf{R}은 상삼각 행렬임을 확인할 수 있다.

경제적 QR 분해

QR 분해는 때로는 경제적 형태로 계산되기도 한다. 경제적 QR 분해는 원래 행렬의 열 수가 행 수보다 적을 때 사용된다. 경제적 QR 분해에서는 \mathbf{Q}가 완전한 직교 행렬이 아니며, \mathbf{R}도 더 작은 상삼각 행렬로 나타난다.

MATLAB에서 경제적 QR 분해를 수행하려면, qr 함수에 'econ' 옵션을 추가한다:

[Q, R] = qr(A, 'econ');

예를 들어, 4 \times 3 행렬 \mathbf{A}에 대해 경제적 QR 분해를 수행하면 \mathbf{Q}4 \times 3 행렬이 되고, \mathbf{R}3 \times 3 행렬이 된다.

하우스홀더 변환을 이용한 QR 분해

MATLAB에서는 qr 함수가 내부적으로 하우스홀더 변환을 사용하여 QR 분해를 수행한다. 하우스홀더 변환은 QR 분해를 계산하는 데 매우 효율적이며, 특히 대규모 행렬에 대해 안정적으로 작동한다. MATLAB 사용자는 이러한 내부 구현을 신경 쓰지 않고, 단순히 qr 함수를 호출하여 QR 분해를 사용할 수 있지만, 이 알고리즘이 어떻게 동작하는지 이해하면 더 깊은 수치 해석적 통찰을 얻을 수 있다.

하우스홀더 변환의 개념

하우스홀더 변환은 벡터를 특정한 방향으로 반사시키는 정규 직교 변환이다. 특정 벡터 \mathbf{x}를 주어진 방향 \mathbf{v}에 대해 반사시키는 하우스홀더 행렬 \mathbf{H}는 다음과 같이 정의된다:

\mathbf{H} = \mathbf{I} - 2\frac{\mathbf{v}\mathbf{v}^\top}{\mathbf{v}^\top\mathbf{v}}

여기서 \mathbf{I}는 항등 행렬이며, \mathbf{v}는 반사 방향 벡터이다.

하우스홀더 변환을 사용하여 QR 분해를 수행할 때, \mathbf{A}의 열 벡터들을 적절히 반사시켜 \mathbf{R}을 상삼각 행렬로 만들 수 있다. 이 과정에서 \mathbf{Q}는 여러 개의 하우스홀더 행렬들의 곱으로 표현된다.

기븐스 회전을 이용한 QR 분해

기븐스 회전은 QR 분해를 수행하는 또 다른 방법이다. 기븐스 회전은 하우스홀더 변환보다 계산 복잡도가 다소 높을 수 있지만, 특정 상황에서는 더 효율적일 수 있다. 특히, 희소 행렬이나 특정 구조를 가진 행렬에 대해 기븐스 회전을 이용한 QR 분해는 유리한 선택일 수 있다.

기븐스 회전의 개념

기븐스 회전은 2차원 평면에서 회전을 수행하는 2 \times 2 직교 행렬 \mathbf{G}를 사용하여 QR 분해를 수행한다. 특정 벡터 \mathbf{x}를 회전시키기 위해 사용되는 기븐스 행렬은 다음과 같이 정의된다:

\mathbf{G} = \begin{bmatrix} c & s \\ -s & c \end{bmatrix}

여기서 c = \cos(\theta), s = \sin(\theta)이며, \theta는 회전 각도이다.

기븐스 회전을 사용하여 QR 분해를 수행할 때, 행렬 \mathbf{A}의 각 행과 열을 차례로 회전시켜 \mathbf{R}을 상삼각 행렬로 변환한다. 이 과정에서 여러 개의 기븐스 회전 행렬들이 곱해져 직교 행렬 \mathbf{Q}를 구성하게 된다.

MATLAB에서의 기븐스 회전 사용

MATLAB에서는 기븐스 회전을 직접적으로 사용하는 경우가 드물지만, qr 함수가 기븐스 회전을 내부적으로 사용할 수 있다. 사용자들은 특별히 기븐스 회전을 구현할 필요 없이, qr 함수를 통해 일반적인 QR 분해를 수행할 수 있다.

QR 분해 결과 확인 및 해석

MATLAB에서 qr 함수를 사용하여 얻은 \mathbf{Q}\mathbf{R} 행렬의 정확성을 확인하는 방법은 간단한다. 다음의 관계가 성립해야 한다:

\mathbf{A} = \mathbf{Q} \mathbf{R}

따라서, \mathbf{Q}\mathbf{R}이 원래의 행렬 \mathbf{A}와 같은지 확인하여 QR 분해가 올바르게 수행되었는지 검증할 수 있다. MATLAB에서는 다음과 같이 확인할 수 있다:

A = [1 2 3; 4 5 6; 7 8 9];
[Q, R] = qr(A);
A_reconstructed = Q * R;

A_reconstructed가 원래의 행렬 A와 동일하다면 QR 분해가 제대로 수행된 것이다.

QR 분해의 응용: 선형 회귀 분석

QR 분해는 선형 회귀 분석에서 매우 유용하게 사용된다. 선형 회귀 문제는 보통 다음과 같이 표현된다:

\mathbf{y} = \mathbf{X}\mathbf{\beta} + \mathbf{\epsilon}

여기서 \mathbf{y}는 관측된 결과, \mathbf{X}는 독립 변수의 설계 행렬, \mathbf{\beta}는 회귀 계수 벡터, \mathbf{\epsilon}은 오차 벡터이다.

최소 제곱 방법을 통해 회귀 계수 \mathbf{\beta}를 추정할 수 있는데, 이 문제를 QR 분해를 통해 효율적으로 해결할 수 있다. 구체적으로, 설계 행렬 \mathbf{X}를 QR 분해하여, 다음과 같은 간단한 형태로 변환한다:

\mathbf{X} = \mathbf{Q}\mathbf{R}

이 때, 회귀 계수 벡터 \mathbf{\beta}는 다음과 같이 계산된다:

\mathbf{\beta} = \mathbf{R}^{-1}\mathbf{Q}^\top\mathbf{y}

MATLAB에서 이 과정을 구현하는 방법은 다음과 같다:

X = [1 1; 1 2; 1 3; 1 4];
y = [6; 5; 7; 10];
[Q, R] = qr(X, 0);  % 경제적 QR 분해 사용
beta = R \ (Q' * y);

이 결과로 얻은 beta 벡터는 선형 회귀 문제의 해를 나타낸다.

QR 분해의 수치적 안정성

QR 분해는 수치적 안정성이 뛰어난 방법으로 잘 알려져 있다. 행렬의 조건 수가 크거나, 계산 과정에서의 오차가 중요한 문제에서 QR 분해는 일반적으로 안정적인 결과를 제공한다. 이는 QR 분해가 직교 행렬 \mathbf{Q}를 생성하기 때문에, 원래 행렬의 크기가 비교적 유지되며, 계산 중 발생할 수 있는 오차가 최소화되기 때문이다.

예를 들어, 대규모 행렬이나 희소 행렬에 대해 QR 분해를 사용할 때, 다른 방법(예: 직접 역행렬 계산 등)보다 훨씬 안정적인 결과를 얻을 수 있다.

대규모 행렬에서의 QR 분해

대규모 행렬에 대해 QR 분해를 수행할 때는 계산 시간과 메모리 사용량이 중요한 문제가 된다. MATLAB에서는 이러한 대규모 문제를 해결하기 위해 다양한 방법들이 제공된다. 예를 들어, 경제적 QR 분해 또는 Sparse QR 분해 기법을 사용하여 메모리 사용량을 줄이고 계산 효율성을 높일 수 있다.

대규모 행렬에 대해 QR 분해를 수행할 때 MATLAB의 병렬 연산 기능을 활용하는 것도 좋은 방법이다. MATLAB은 parfor 루프를 통해 다중 코어 프로세서를 이용하여 QR 분해를 병렬로 수행할 수 있다.

QR 분해의 시각화

MATLAB에서 QR 분해의 결과를 시각화하는 것도 유용할 수 있다. 시각화를 통해 직교 행렬 \mathbf{Q}와 상삼각 행렬 \mathbf{R}의 구조를 이해할 수 있으며, 특히 교육적인 목적으로 유용하다.

예를 들어, 다음과 같이 행렬의 구조를 시각화할 수 있다:

A = rand(5, 3);  % 임의의 5x3 행렬
[Q, R] = qr(A);
subplot(1, 3, 1), imagesc(A), colorbar, title('Original Matrix A');
subplot(1, 3, 2), imagesc(Q), colorbar, title('Orthogonal Matrix Q');
subplot(1, 3, 3), imagesc(R), colorbar, title('Upper Triangular Matrix R');

이 코드 조각은 행렬 \mathbf{A}, \mathbf{Q}, \mathbf{R}의 구조를 색상 맵을 사용하여 시각화한다.