로그인   |  회원가입  |  사이트맵  |  Contact Us
  아이디 저장하기
 
홈 > SAS Tech & Tip > SAS Programming 활용하기
[SAS 프로그래밍] SAS/IML(interactive matrix language)로 행렬 연산하는 방법 2018.02.08
김효범 416 0
http://www.mysas.co.kr/sas_tiptech/a_question.asp?b_no=7607&cmd=content&bd_no=5

 

 

 안녕하세요 이번시간에는 저번시간에 이어서 행렬언어인 SAS/IML에 대해 좀 더 알아보는 시간을 가지겠습니다. 저번시간에는 간단한 행렬을 만들고 행 또는 열을 추가 또는 크기를 바꾸는 법에 대해서 알아보았습니다. 이번시간에는 행렬연산을 하는 법에 대해 다뤄보겠습니다.

 

 

 

Matrix Operations

 우선, 기본적인 행렬계산인 상수를 곱하고 행렬끼리 더하는 방법은 다음과 같습니다. a라는 2x3 행렬이 있을 때 행렬에 3을 곱하고 b라는 2x3행렬을 더하는 과정을 나타내 보겠습니다.

행렬의 실수배를 하거나 행렬의 덧셈을 하는 경우 곱셈기호로는 ‘*’를 사용하고 덧셈이나 뺄셈은 ‘+’, ‘-‘를 사용하면 됩니다. 그리고 벡터의 내적과 같은 행렬의 곱을 앞 행렬의 열과 뒤 행렬의 행의 수가 같아야 하며 행렬의 실수배와 마찬가지로 곱셈기호 ‘*’를 사용합니다. 예를 들어 위에서 만든 2x3크기의 행렬 a3x1크기의 행렬을 곱하면 2x1크기의 행렬이 만들어집니다..

행렬 a1행에 있는 1, 2, 3에 각각 행렬 c 1열의 각행의 수를 곱하여 1x1+2x2+3x3=142행에 있는 2, 3, 4에도 행렬 c 1열을 곱하여 1x2+2x3+3X4=20 이 계산된 것을 확인하였습니다.

 

 

 

 IML에서는 nxp 크기의 행렬에 대해 nx1 또는 1xp행렬로 사칙연산이 가능합니다. 예를 들어 nx3짜리 행렬이 있을 때 1x3행렬의 각 열의 세개의 값들이 nx3행렬의 각 열의 모든 행에 공통으로 작용하여 사칙연산을 수행하게 됩니다. 하지만, 곱하기의 경우 행렬의 곱(벡터의 내적)과 구분을 해야 하기 때문에 ‘*’기호 대신 ‘#’기호를 사용하면 됩니다. 마찬가지로 px1행렬의 p개의 값들이 nxp행렬의 각 행의 모든 열에 작용하여 사칙연산을 하게 됩니다. 2x3행렬과 3x2행렬에 대해 각각 1x3행렬과 3x1행렬로 사칙연산을 수행해보겠습니다.

우선 3x2행렬에 대해 3x1행렬로 연산을 한 결과입니다. 결과에서 보듯이 3x1행렬의 각 행의 값들이 3x2행렬의 각 행의 모든 열에 공통으로 적용되어 계산된 것을 확인할 수 있습니다.

이번엔 행과 열을 바꿔서 2x3행렬에 대해 1x3행렬로 연산을 한 결과입니다. 1x3행렬의 각 열의 값들이 2x3행렬의 각 열의 모든 행에 공통으로 적용되어 계산된 것을 확인하였습니다.

 

 

 

뿐만 아니라 nxp 크기의 행렬A에 대해서 nxp 크기의 행렬B 또한 사칙연산이 가능합니다. 같은 nxp 크기의 행렬이기 때문에 행렬에 존재하는 성분의 수 또한 같을 것입니다. 그렇기 때문에 이러한 경우에는 A행렬의 각 성분마다 같은 위치에 있는 B행렬의 성분이 존재하고 그 두 성분끼리 연산을 수행하게 되는 것입니다. 2x3크기의 행렬을 예로 들어 성분 간의 곱하기와 더하기의 사칙연산이 수행된 결과를 보여드리겠습니다.

 2x3크기의 행렬A에 대해 2x3크기의 행렬B로 연산을 수행한 결과입니다. 성분간 곱하기 연산을 수행한 AB_1행렬, 더하기는 AB_2행렬을 통해 연산이 의도한대로 이루어 진 것을 확인하였습니다.

 

 

 

 1x1크기의 행렬, 즉 스칼라 값이 행렬에 대해 연산이 이루어 질 때는 흔히 행렬의 모든 성분에 대해 실수 배를 할 때이지만 IML에서는 스칼라 값으로 nxp크기의 행렬에 대해 덧셈이나 뺄셈도 할 수가 있습니다. 실수 배를 할 때와 마찬가지로 스칼라 값 하나가 행렬의 모든 성분에 공통으로 연산작용을 하게 됩니다. 위에서 실습한 행렬A를 통해 확인해보겠습니다.

행렬A 1을 빼는 연산을 수행한 결과 행렬의 모든 성분에서 -1 의 연산이 수행된 것을 확인였습니다.

 

 

 

마치며

오늘은 IML을 통해 행렬 연산을 하는 법에 대해 알아보았습니다. 기본적인 행렬 연산인 행렬의 실수 배, 더하기, 빼기, 벡터의 내적 개념인 행렬 곱 외에도 nxp크기의 행렬에 대해 1x1, nx1, 1xp, nxp 네 종류의 크기를 가진 행렬로도 연산이 가능하다는 것을 알았습니다.

 

 

 

 

 Reference

https://support.sas.com/resources/papers/proceedings13/144-2013.pdf

 

 

 
 
 
 
 [SAS 프로그래밍] SAS/IML(interactive matrix language)로 SAS dataset을 행렬로 저장하는 방법
 [SAS 프로그래밍] SAS/IML(interactive matrix language)로 간단한 행렬만들기