이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

행렬과 마방진

행렬 정보

MATLAB® 환경에서 행렬은 수로 구성된 사각 배열입니다. 경우에 따라 1x1 행렬과 행과 열이 하나뿐인 행렬에는 각각 스칼라와 벡터라는 특별한 의미가 부여됩니다. MATLAB에서는 숫자형 데이터와 숫자형이 아닌 데이터를 모두 여러 가지 방법으로 저장할 수 있지만, 처음에는 대개 모든 것을 행렬로 간주하는 것이 가장 좋습니다. MATLAB의 연산은 최대한 자연스럽게 실행되도록 설계되어 있습니다. 다른 프로그래밍 언어에서는 수를 한 번에 하나씩 다루지만 MATLAB에서는 전체 행렬을 쉽고 빠르게 다룰 수 있습니다. 이 설명서 전반에 걸쳐 사용되는 행렬의 좋은 예는 독일의 예술가이자 아마추어 수학자인 알브레히트 뒤러(Albrecht Durer)가 르네상스 시대에 만든 판화인 멜랑콜리아 I(Melencolia I)에서 확인할 수 있습니다.

이 이미지는 수학 기호 체계로 가득 채워져 있으며, 자세히 살펴보면 오른쪽 위 코너에 행렬이 보일 것입니다. 이 행렬은 마방진으로 알려져 있습니다. 뒤러(Durer)가 살던 시대의 많은 사람들은 이 행렬에 신비한 속성이 있다고 생각했습니다. 그리고 오늘날에도 연구해 볼 만한 매우 흥미로운 특성이 있는 것으로 밝혀졌습니다.

행렬 입력

MATLAB을 시작하기 위한 가장 좋은 방법은 행렬을 다루는 방식을 배우는 것입니다. MATLAB을 시작하고 각각의 예제를 따라 진행하십시오.

다양한 방법으로 MATLAB에 행렬을 입력할 수 있습니다.

  • 명시적으로 요소의 목록을 입력합니다.

  • 외부 데이터 파일에서 행렬을 불러옵니다.

  • 내장 함수를 사용하여 행렬을 생성합니다.

  • 자신만의 고유한 함수로 행렬을 만들어 파일에 저장합니다.

먼저 뒤러(Durer)의 행렬을 해당 요소 목록으로 입력하는 것부터 시작하겠습니다. 다음과 같은 몇 가지 기본 규칙만 따르면 됩니다.

  • 행의 요소를 공백이나 쉼표로 구분합니다.

  • 세미콜론(;)을 사용하여 각 행의 끝을 나타냅니다.

  • 전체 요소 목록을 대괄호([ ])로 둘러쌉니다.

뒤러(Durer)의 행렬을 입력하려면 해당 행렬을 명령 창에 입력하면 됩니다.

A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]

그러면 MATLAB에 방금 입력한 행렬이 표시됩니다.

A = 
    16     3     2    13
     5    10    11     8
     9     6     7    12
     4    15    14     1

이 행렬은 뒤러(Durer)가 제작한 판화의 숫자와 일치합니다. 한 번 입력된 행렬은 MATLAB 작업 공간에 자동으로 저장됩니다. 이 행렬은 간단히 A로 나타낼 수 있습니다. 작업 공간에 A라는 행렬이 만들어졌으므로 이제 이 행렬의 어떤 부분이 그토록 흥미로운지 살펴보겠습니다. 과연 무엇 때문에 신비하다고 하는 것일까요?

합, 전치, 대각화

이미 마방진의 특별한 속성이 해당 요소의 합을 다양하게 구하는 방법과 관련이 있다는 것을 알아채셨을 수도 있습니다. 즉, 행이나 열을 따라 합을 구하거나 두 개의 주대각선을 따라 합을 구하면 항상 동일한 수치를 얻게 된다는 것입니다. MATLAB을 사용하여 이를 확인해 보겠습니다. 사용해 볼 첫 번째 명령문은 다음과 같습니다.

sum(A)

MATLAB에서는 다음과 같은 결과를 반환합니다.

ans =
    34    34    34    34

출력 변수를 지정하지 않으면 MATLAB에서는 answer를 뜻하는 변수 ans를 사용하여 계산 결과를 저장합니다. 이제 A를 구성하는 열의 합이 포함된 행 벡터를 계산했습니다. 마방진 각 열의 합은 34로 모두 동일합니다.

행의 합은 어떻게 구할 수 있을까요? MATLAB은 기본적으로 행렬의 열을 처리하도록 설정되어 있으므로, 행의 합을 구하는 한 가지 방법은 먼저 행렬을 전치하고, 전치된 상태의 행렬에서 열 합을 계산한 다음 결과를 전치하는 것입니다.

MATLAB에는 두 개의 전치 연산자가 있습니다. 아포스트로피 연산자(예: A')는 켤레 복소수 전치를 수행합니다. 또한 행렬을 주대각선을 기준으로 뒤집고, 행렬의 복소수 요소를 구성하는 허수 성분의 기호를 변경하기도 합니다. 점-아포스트로피 연산자(A.')는 복소수 요소의 기호에 영향을 주지 않으면서 전치를 수행합니다. 실수 요소만 포함되어 있는 행렬의 경우에는 두 연산자가 모두 동일한 결과를 반환합니다.

따라서 다음을 실행하면

A'

다음과 같은 결과가 생성됩니다.

ans =
    16     5     9     4
     3    10     6    15
     2    11     7    14
    13     8    12     1

또한 다음을 실행하면

sum(A')'

행의 합이 포함된 열 벡터가 생성됩니다.

ans =
    34
    34
    34
    34

이외에도 행렬을 이중으로 전치하지 않고 행의 합을 구하는 방법으로는 sum 함수의 차원 인수를 사용하는 방법이 있습니다.

sum(A,2)

다음과 같은 결과가 생성됩니다.

ans =
    34
    34
    34
    34

주대각선에 있는 요소의 합은 sum 함수와 diag 함수를 사용하여 구할 수 있습니다.

diag(A)

다음과 같은 결과가 생성됩니다.

ans =
    16
    10
     7
     1

또한

sum(diag(A))

다음과 같은 결과가 생성됩니다.

ans =
    34

소위 반 대각선(Anti-diagonal)이라고 하는 다른 대각선은 수학적으로 그다지 중요하지 않으므로 MATLAB에는 이 대각선을 위해 사전에 만들어진 함수가 없습니다. 하지만 원래 그래픽스에 사용하도록 만들어진 함수인 fliplr을 실행하면 행렬이 왼쪽에서 오른쪽으로 뒤집어집니다.

sum(diag(fliplr(A)))
ans =
    34

지금까지 뒤러(Durer)의 판화에 나와 있는 행렬이 실제로 마방진이라는 것을 확인했습니다. 이 과정에서 몇 개의 MATLAB 행렬 연산을 샘플로 수행해 보았습니다. 다음 섹션에서는 계속해서 이 행렬을 사용하여 MATLAB의 추가적인 기능을 설명하겠습니다.

magic 함수

MATLAB에는 거의 모든 크기의 마방진을 생성하는 함수가 내장되어 있는데, magic이라는 이름의 함수입니다.

B = magic(4)
B = 
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

이 행렬은 뒤러(Durer)의 판화에 나와 있는 것과 거의 동일하며, 모든 "마방진"의 속성을 지니고 있습니다. 유일한 차이점은 두 가운데 열의 위치가 서로 뒤바뀌어 있다는 점입니다.

B의 가운데 두 열의 위치를 서로 바꿔서 뒤러의 행렬 A처럼 만들 수 있습니다. B의 각 행에 대해 다음과 같이 1, 3, 2, 4로 지정된 순서로 열을 재배열합니다.

A = B(:,[1 3 2 4])
A = 
    16     3     2    13
     5    10    11     8
     9     6     7    12
     4    15    14     1

행렬 생성

MATLAB에서는 네 개의 함수를 사용하여 기본 행렬을 생성합니다.

zeros

모든 요소가 0임

ones

모든 요소가 1임

rand

임의의 요소가 균등 분포됨

randn

임의의 요소가 정규분포됨

다음은 몇 가지 예입니다.

Z = zeros(2,4)
Z =
     0     0     0     0
     0     0     0     0

F = 5*ones(3,3)
F =
     5     5     5
     5     5     5
     5     5     5

N = fix(10*rand(1,10))
N =
     9     2     6     4     8     7     4     0     8     4

R = randn(4,4)
R =
    0.6353    0.0860   -0.3210   -1.2316
   -0.6014   -2.0046    1.2366    1.0556
    0.5512   -0.4931   -0.6313   -0.1132
   -1.0998    0.4620   -2.3252    0.3792