희소 행렬의 그래픽 표현
이 예제에서는 두 개의 뒷전 플랩(Trailing Flap)을 포함한 NASA 에어포일의 유한 요소 메시를 보여줍니다. 에어포일의 역사에 대한 자세한 내용은 NACA 에어포일(nasa.gov)에서 확인할 수 있습니다.
데이터는 airfoil.mat
파일에 저장되어 있습니다. 이 데이터는 메시 점 (x,y) 좌표 4,253쌍으로 구성되어 있으며, 메시 점 사이의 연결을 지정하는, 12,289쌍의 인덱스로 구성된 배열 (i,j)도 포함하고 있습니다.
데이터 파일을 작업 공간으로 불러옵니다.
load airfoil
유한 요소 메시 보기
먼저 범위가 되도록 x
와 y
를 로 스케일링합니다. 그런 다음, (i,j) 연결에서 희소 인접 행렬을 생성하고 양의 정부호 행렬로 만듭니다. 마지막으로, (x,y)를 꼭짓점(메시점)의 좌표로 사용하여 인접 행렬을 플로팅합니다.
% Scaling x and y x = pow2(x,-32); y = pow2(y,-32); % Forming the sparse adjacency matrix and making it positive definite n = max(max(i),max(j)); A = sparse(i,j,-1,n,n); A = A + A'; d = abs(sum(A)) + 1; A = A + diag(sparse(d)); % Plotting the finite element mesh gplot(A,[x y]) title('Airfoil Cross-Section')
희소성 패턴 시각화하기
spy
를 사용하여 행렬의 0이 아닌 요소를 시각화할 수 있습니다. 이 함수는 희소 행렬의 희소성 패턴을 표시하는 데 특히 유용합니다. spy(A)
는 행렬 A
의 희소성 패턴을 플로팅합니다.
spy(A)
title('Airfoil Adjacency Matrix')
대칭적 재정렬(Reordering) - 컷힐-맥키(Cuthill-McKee) 역치환
symrcm
은 인접 행렬을 재정렬하는 데 컷힐-맥키 역치환 기법을 사용합니다. r = symrcm(A)
는 A(r,r)
의 대각선 요소들을 A
보다 더 대각선에 가깝게 만들어 주는 치환 벡터 r
을 반환합니다. 이 형식은 "행이 많고 열이 적은(long and skinny)" 문제에서 비롯된 행렬의 LU 분해 또는 촐레스키 분해를 구할 때 유용한 전위 정렬 기법입니다. symrcm은 대칭 행렬일 때는 물론, 비대칭 행렬일 때에도 동작합니다.
r = symrcm(A);
spy(A(r,r))
title('Reverse Cuthill-McKee')
대칭적 재정렬 - 열 치환
j = COLPERM(A)
를 사용하면 0이 아닌 요소의 개수를 기준으로 비내림차순으로 희소 행렬 A
의 열들을 재정렬하는 치환 벡터가 반환됩니다. 이 형식은 경우에 따라 LU 분해 lu(A(:,j))
에 대한 전위 정렬 기법으로 유용하게 활용할 수 있습니다.
j = colperm(A);
spy(A(j,j))
title('Column Count Reordering')
대칭적 재정렬 - 대칭적 AMD(Approximate Minimum Degree)
symamd
는 대칭적 AMD(Approximate Minimum Degree) 치환을 제공합니다. A
가 양의 정부호 대칭 행렬인 경우, 명령 p = symamd(S)
는 S(p,p)
가 S
보다 더 희소한 촐레스키 인수를 갖는 경향이 있는 치환 벡터 p
를 반환합니다. 경우에 따라 symamd
는 부정부호 대칭 행렬에 대해서도 효과적으로 동작합니다.
m = symamd(A);
spy(A(m,m))
title('Approximate Minimum Degree')