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 으로 쉽게 변경 가능 해야 함
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
;