인덱싱
첨자
A
의 행 i
와 열 j
의 요소는 A(i,j)
로 나타냅니다. 예를 들어, A(4,2)
는 네 번째 행과 두 번째 열의 숫자입니다. 마방진의 경우 A(4,2)
는 15
입니다. 따라서 A
의 네 번째 열에 있는 요소의 합을 계산하려면 다음을 입력합니다.
A(1,4) + A(2,4) + A(3,4) + A(4,4)
이 첨자는 다음과 같은 결과를 생성합니다.
ans = 34
하지만 이것이 단일 열의 합을 가장 효율적으로 구하는 방식은 아닙니다.
단일 첨자 A(k)
를 사용하여 행렬의 요소를 나타낼 수도 있습니다. 단일 첨자는 행 벡터와 열 벡터를 나타내는 일반적인 방식입니다. 단일 첨자는 2차원 행렬에도 적용될 수 있는데, 이 경우 배열은 원본 행렬의 열에서 구성된 하나의 긴 열 벡터로 간주됩니다. 따라서 마방진의 경우 A(8)
을 사용해도 A(4,2)
에 저장된 값 15
를 나타낼 수 있습니다.
행렬의 범위를 벗어난 요소 값을 사용하려고 하면 오류가 발생합니다.
t = A(4,5)
Index exceeds matrix dimensions.
이와 반대로 행렬의 범위를 벗어난 요소의 값을 저장하면 새로운 요소를 받아들이도록 크기가 늘어납니다.
X = A; X(4,5) = 17 X = 16 3 2 13 0 5 10 11 8 0 9 6 7 12 0 4 15 14 1 17
콜론 연산자
콜론(:
)은 가장 중요한 MATLAB® 연산자 중 하나로, 다음과 같은 여러 가지 형태로 사용됩니다. 다음 표현식은
1:10
1에서 10까지의 정수가 포함된 행 벡터입니다.
1 2 3 4 5 6 7 8 9 10
비단위 간격(간격: 1 아님) 결과를 구하려면 증분을 지정하십시오. 예를 들면 다음과 같습니다.
100:-7:50
이는 아래와 같습니다.
100 93 86 79 72 65 58 51
또한
0:pi/4:pi
이는 아래와 같습니다.
0 0.7854 1.5708 2.3562 3.1416
콜론을 수반하는 첨자 표현식은 행렬의 일부를 나타냅니다.
A(1:k,j)
이는 A
의 j
번째 열에 있는 k
요소를 나타냅니다. 따라서 다음은
sum(A(1:4,4))
네 번째 열의 합을 계산합니다. 하지만 이 계산을 보다 효과적으로 수행하는 방법이 있습니다. 콜론 자체는 행렬의 행이나 열에 있는 모든 요소를 나타내며 키워드 end
는 마지막 행이나 열을 나타냅니다. 따라서 다음은
sum(A(:,end))
A
의 마지막 열에 있는 요소의 합을 계산합니다.
ans = 34
그러면 어째서 4×4 마방진의 합이 34가 되는 것일까요? 1에서 16까지의 정수가 각각 합이 동일한 네 개의 그룹으로 정렬되는 경우 이러한 합은 다음과 같아야 합니다.
sum(1:16)/4
그리고 이는 당연히 다음과 같은 결과로 이어집니다.
ans = 34
결합
결합(Concatenate)은 작은 행렬을 결합하여 더 큰 행렬을 만드는 과정입니다. 실제로 위에서 첫 번째 행렬을 만들 때 행렬의 개별 요소들을 결합(Concatenate)했습니다. 대괄호 쌍([]
)은 결합(Concatenate) 연산자입니다. 예를 들어, 4×4 마방진 A
로 시작하여 다음과 같이 만들어 보겠습니다.
B = [A A+32; A+48 A+16]
이 결과 8×8 행렬이 만들어지며, 이는 네 개의 부분행렬을 결합하여 얻은 결과입니다.
B = 16 3 2 13 48 35 34 45 5 10 11 8 37 42 43 40 9 6 7 12 41 38 39 44 4 15 14 1 36 47 46 33 64 51 50 61 32 19 18 29 53 58 59 56 21 26 27 24 57 54 55 60 25 22 23 28 52 63 62 49 20 31 30 17
이 행렬은 또 다른 마방진이 되기 위한 중간 형태에 해당합니다. 이 행렬의 요소는 정수 1:64
를 다시 배열한 것이며, 행렬의 열 합은 8×8 마방진에 해당하는 올바른 값을 나타냅니다.
sum(B) ans = 260 260 260 260 260 260 260 260
하지만 이 행렬의 행 합인 sum(B')'
는 모두가 같지는 않습니다. 이를 유효한 8×8 마방진으로 만들려면 추가로 조작해야 합니다.
행 삭제와 열 삭제
대괄호 한 쌍만 사용하여 행렬에서 행과 열을 삭제할 수 있습니다. 먼저, 다음과 같이 시작합니다.
X = A;
그런 다음 X
의 두 번째 열을 삭제하려면 다음 식을 사용합니다.
X(:,2) = []
그러면 X
가 다음과 같이 변경됩니다.
X = 16 2 13 5 11 8 9 7 12 4 14 1
행렬의 단일 요소를 삭제하면 더 이상 행렬이 아닌 결과를 얻게 됩니다. 따라서 다음과 같은 표현식을 사용하면
X(1,2) = []
오류가 발생합니다. 하지만 단일 첨자를 사용하면 단일 요소 또는 일련의 요소가 삭제되고 나머지 요소는 행 벡터로 형태 변경(reshape)됩니다. 따라서 다음을 실행하면
X(2:2:10) = []
다음과 같은 결과를 얻게 됩니다.
X = 16 9 2 7 13 12 1
스칼라 확장
행렬과 스칼라는 여러 가지 방법으로 결합할 수 있습니다. 예를 들어, 스칼라를 각 요소에서 빼는 방식으로 행렬에서 스칼라를 뺍니다. 여기서 살펴본 마방진에 있는 요소의 평균값은 8.5이므로 다음을 사용하면
B = A - 8.5
다음과 같이 열의 합이 0인 행렬이 만들어집니다.
B = 7.5 -5.5 -6.5 4.5 -3.5 1.5 2.5 -0.5 0.5 -2.5 -1.5 3.5 -4.5 6.5 5.5 -7.5 sum(B) ans = 0 0 0 0
MATLAB에서는 스칼라 확장으로 지정된 스칼라를 범위 내의 모든 인덱스에 대입합니다. 예를 들면 다음과 같습니다.
B(1:2,2:3) = 0
이는 다음과 같이 B
의 일부를 소거합니다.
B = 7.5 0 0 4.5 -3.5 0 0 -0.5 0.5 -2.5 -1.5 3.5 -4.5 6.5 5.5 -7.5
논리 첨자
논리 연산과 관계 연산으로 생성된 논리 벡터는 부분배열을 참조하는 데 사용할 수 있습니다. X
는 일반 행렬이고 L
은 특정한 논리 연산으로 얻은 동일한 크기의 행렬이라고 가정해 보겠습니다. 그러면 X(L)
은 X
의 요소 중 L
의 요소가 0이 아닌 요소를 지정합니다.
이러한 유형의 첨자는 논리 연산을 첨자 표현식으로 지정하여 한 번에 수행할 수 있습니다. 다음과 같은 데이터 세트가 있다고 가정해 보겠습니다.
x = [2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8];
NaN
은 질문서의 항목에 응답하지 않은 부분 같이 누락된 관측값을 나타내는 마커입니다. 논리형 인덱싱으로 누락된 데이터를 제거하려면 isfinite(x)
를 사용하십시오. 이는 모든 유한한 숫자형 값에 대해서는 true이고 NaN
과 Inf
에 대해서는 false입니다.
x = x(isfinite(x)) x = 2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8
이제 5.1
이라는 관측값 하나가 다른 관측값과 매우 다르게 보이는데, 이를 이상값이라고 합니다. 다음 명령문을 실행하면 이상값이 제거되는데, 이 경우에는 평균에서 3 표준편차를 초과하는 요소가 해당됩니다.
x = x(abs(x-mean(x)) <= 3*std(x)) x = 2.1 1.7 1.6 1.5 1.9 1.8 1.5 1.8 1.4 2.2 1.6 1.8
또 다른 예로, 논리형 인덱싱과 스칼라 확장을 사용하여 소수가 아닌 수를 0으로 설정하는 방식으로 뒤러(Durer)의 마방진에서 소수의 위치를 강조 표시해 보겠습니다. magic 함수 항목을 참조하십시오.
A(~isprime(A)) = 0 A = 0 3 2 13 5 0 11 0 0 0 7 0 0 0 0 0
find 함수
find
함수는 주어진 논리 조건을 충족하는 배열 요소로 구성된 인덱스를 확인합니다. 가장 단순한 형태인 find
는 인덱스로 구성된 열 벡터를 반환합니다. 인덱스로 구성된 행 벡터를 얻으려면 이 벡터를 전치하십시오. 예를 들어, 다시 뒤러의 마방진으로 시작해 보겠습니다. magic 함수 항목을 참조하십시오.
k = find(isprime(A))'
이렇게 하면 1차원 인덱싱으로 마방진에서 소수의 위치를 선택할 수 있습니다.
k = 2 5 9 10 11 13
이 소수들을 k
로 결정된 순서에 따라 다음을 통해 행 벡터로 표시해 보겠습니다.
A(k) ans = 5 3 2 11 7 13
대입문에서 k
를 좌변 인덱스로 사용하면 행렬 구조체가 보존됩니다.
A(k) = NaN A = 16 NaN NaN NaN NaN 10 NaN 8 9 6 NaN 12 4 15 14 1