rand(life)
행렬의 연산을 이용한 배열 수식 본문
지식인 질문 중 큰형님 답변
F:H 범위와 같이 주어진 표를 이용해
노란색 셀에 들어갈 수식을 찾는 문제이다.
처음에는 If 구문을 세 번 쓰고
그 안에서 match 함수를 이용해 찾는다고 생각을 했다. 오른쪽으료 표가 더 길어지만 VBA를 이용하고......
그런데 큰형님의 답은
=MAX(INDEX(($F$2:$H$6=B2)*$F$1:$H$1,))
아주 간결하다.
이 수식이 어떻게 동작하는지 알려면
엑셀에서 범위의 곱셈이 어떻게 동작하는지 알아야한다.
엑셀의 범위는 수학에서 배우는 행렬과 유사하게 생겼지만 연산은 약간 다르다
일단 수학에서 말하는 행렬의 연산을 위키백과에서 알아보면 다음과 같다.
행렬 와 가 있을 때, 이 둘의 곱셈은 다음과 같다.
행렬 와 가 있을 때, 이 둘의 곱셈은 다음과 같다.
그리고, 정방형 행렬이 아닌 행렬의 곱셈을 제타위키에서 찾아보면 다음과 같다.
=A1:B4*D1:D4
둘 다 같은 결과가 나온다.
따라서, 위에서 행이 하나였던 경우와 비교해서 생각해보면,
범위끼리 곱셈을 할 때, 기본적으로 두 범위가 서로 같은 크기이면,
서로의 위치에 대응하는 셀이 일대일로 곱셈을 하고
행이나 열이 하나뿐이면, 그 하나의 행이나 열이 대신해서 나머지 범위와 곱셈을 한다는 것을 알 수 있다.
=A1:B4*D1:E2
이런 경우는
행이나 열이 하나였으면 그 하나 있는 행이나 열이 대신 했을 계산을,
행이나 열이 두 개가 되면서, 각자 자기와 대응되는 셀 하나와만 계산을 하게 되므로
계산할 짝이 없는 나머지는 오류를 발생시키게 된다.
자, 이제 애초의 수식으로 돌아가자.
=MAX(INDEX(($F$2:$H$6=B2)*$F$1:$H$1,))
C2셀의 수식을 예로 들어,
수식 - 수식 계산을 통해, 단계별로 어떻게 계산이 되는지 살펴보자.
이전에 살펴본 것처럼, 밑줄이 쳐져 있는 부분이 이번 단계에서 계산이 될 예정인 것이고
이탤릭체로 된 부분은 이전단계에서 계산이 끝난 결과이다.
표 범위와 B2 이름이 같은지 확인하는 과정이다
F2:H6 범위의 값과 b2의 값인 '완자'를 비교한다
밑줄친 부분을 잘 보면, 세미콜론(;)과 쉼표(,)가 섞여있는데,
세미콜론은 행이 바뀔때 나타나고
쉼표는 열이 바뀔때 나타난다.
즉, 세미콜론이 나올때까지는 모두 같은 행인것이다.
'완자'라는 글자가 있는지 확인해서 TRUE/FALSE 값으로 바뀌었다.
TRUE/FALSE 는 나중에 계산할 때 1과 0으로 취급된다
이제 F1:H1의 범위와 곱하게 된다
F1:H1의 범위는 행이 하나뿐이므로,
F1의 값을 첫열 F2:F6의 모든 값과 곱하고
G1의 값을 두번째열 G2:G6의 모든 값과 곱하고
H1의 값을 세번째열 H2:H6의 모든 값과 곱하게 된다.
그 결과, TRUE는 G3에 한 군데 밖에 없었으므로,
G3의 TRUE와 G1의 3이 곱해서 나온 3 외에 나머지는 모두 0이 된다.