Thinking in Data/[DL] DataSQL

[SQL Quiz] #R006. 행렬 곱셈

띤킹인 2020. 4. 27. 13:15

[SQ020427.001]

최종수정 : 2020.04.28  그림1 수정, 스크립트상 SET_NO --> MAT_NO로 수정

 

1. 문제

정방행렬에 대한 행렬곱을 처리하고자 한다. 테이블에 ‘SET1’과 ‘SET2’가 5x5 행렬 데이터가 존재한다. SET1과 SET2의 행렬곱을 처리하시오.

 

2. 설명

조건)

    1) 행렬 곱을 수행할 두 행렬은 SQ_MAT_SET에 행렬번호, 행번호, 열번호, 값으로 정의되어 있음. "3.데이터"의 생성 스크립트 참고.

    2) 두 행렬은 정방행렬이기 때문에 MAT_DIM에 동일한 행렬 크기 명시됨

    3) 행렬의 크기는 100x100 이하임

    4) 그림1)과 같이 행렬곱의 결과를 다시 SQ_MAT_SET 에 추가

    5) 두 행렬에 대한 전/후 순서 변경할 수 있어야 함. 정방행렬 A,B에 대하여 AB 또는 BA 으로 쉽게 변경 가능 해야 함

 

그림1) 행렬 연산 예시

3. 데이터

정방행렬의 데이터는 행렬번호(MAT_NO), 행렬크기 (MAT_DIM), 행번호(RNO), 열번호(CNO), 값(VAL) 로 구성됩니다. 행렬크기는 정방행렬이기 때문에 하나의 값만 갖게 되며, 행렬과 행렬간 동일한 크기만 연산할 수 있도록 체크하는데 활용될 수 있습니다.

 

DROP TABLE SQ_MAT_SET PURGE;

CREATE TABLE SQ_MAT_SET
(
    MAT_NO VARCHAR2(100)
   ,MAT_DIM NUMBER
   ,RNO NUMBER
   ,CNO NUMBER
   ,VAL NUMBER

);

/*
    행렬 데이터 추가
*/
INSERT INTO SQ_MAT_SET
SELECT MAT_NO
          ,MAT_DIM
          ,RNO
          ,C.NO1 CNO
          ,DECODE(C.NO1,1,C1 ,2,C2 ,3,C3 ,4,C4 ,5,C5 ) VAL

FROM
(

SELECT 'SET1' MAT_NO,5 MAT_DIM,1 RNO,1 C1,4 C2,3 C3,1 C4,2 C5 FROM DUAL UNION ALL
SELECT 'SET1' MAT_NO,5 MAT_DIM,2 RNO,2 C1,3 C2,5 C3,7 C4,1 C5 FROM DUAL UNION ALL
SELECT 'SET1' MAT_NO,5 MAT_DIM,3 RNO,3 C1,2 C2,2 C3,3 C4,5 C5 FROM DUAL UNION ALL
SELECT 'SET1' MAT_NO,5 MAT_DIM,4 RNO,4 C1,1 C2,7 C3,6 C4,4 C5 FROM DUAL UNION ALL
SELECT 'SET1' MAT_NO,5 MAT_DIM,5 RNO,1 C1,7 C2,8 C3,0 C4,1 C5 FROM DUAL UNION ALL
SELECT 'SET2' MAT_NO,5 MAT_DIM,1 RNO,1 C1,1 C2,1 C3,1 C4,5 C5 FROM DUAL UNION ALL
SELECT 'SET2' MAT_NO,5 MAT_DIM,2 RNO,2 C1,3 C2,1 C3,4 C4,1 C5 FROM DUAL UNION ALL
SELECT 'SET2' MAT_NO,5 MAT_DIM,3 RNO,1 C1,1 C2,4 C3,1 C4,2 C5 FROM DUAL UNION ALL
SELECT 'SET2' MAT_NO,5 MAT_DIM,4 RNO,1 C1,1 C2,1 C3,1 C4,1 C5 FROM DUAL UNION ALL
SELECT 'SET2' MAT_NO,5 MAT_DIM,5 RNO,2 C1,2 C2,1 C3,3 C4,1 C5 FROM DUAL
) A
,COPY_T C
WHERE C.NO1 <= 5


COMMIT;

/*
    행렬 조회
*/
SELECT MAT_NO
          ,RNO
          ,MAX(DECODE(CNO,1,VAL)) C01
          ,MAX(DECODE(CNO,2,VAL)) C02
          ,MAX(DECODE(CNO,3,VAL)) C03
          ,MAX(DECODE(CNO,4,VAL)) C04
          ,MAX(DECODE(CNO,5,VAL)) C05
FROM SQ_MAT_SET
WHERE MAT_NO IN ( 'SET1', 'SET2' )
GROUP BY MAT_NO,RNO
ORDER BY MAT_NO,RNO
;