2026a
# 稀疏矩阵的图形表示
此示例说明 NASA 翼型的有限元网格,包括两个尾翼。
数据存储在文件 airfoil.mat 中。数据由 4253 对 (x,y) 网格点坐标组成。此外,还包含一个由 12,289 对索引 (i,j) 组成的数组,这些索引指定网格点之间的连接。
将数据文件加载到工作区。
using TyMath
using TyPlot
using TyBase
path = pkgdir(TyMath)
datapath = path * "/data/airfoil.mat"
load(datapath)
# 查看有限元网格
首先,将 x 和 y 分别以
x = pow2(x,-32)
y = pow2(y,-32)
n = max(maximum(i),maximum(j));
n=Int(n)
v=ones(length(i))*-1
A = sparse(vec(i),vec(j),v,n,n);
A = A + A';
d = abs.(sum(A,dims=1)) .+ 1;
A = A + diagm(vec(d));
gplot(A,[x y])
title("Airfoil Cross-Section")
# 可视化稀疏模式
您可以使用 spy 可视化矩阵中的非零元素,该函数尤其适用于查看稀疏矩阵中的稀疏模式。spy(A) 可以绘制矩阵 A 的稀疏模式。
spy(A)
title("Airfoil Adjacency Matrix")
# 对称重新排序 - 反向卡西尔-麦基
symrcm 使用反向卡西尔-麦基方法对邻接矩阵重新排序。r = symrcm(A) 返回置换向量 r,因此,相对于 A,A[r,r] 往往具有更接近对角线的对角线元素。对于来自“瘦长”问题的矩阵的 LU 或乔列斯基分解来说,这是一种很好的预排序方法。此方法对于对称和非对称矩阵都适用。
r = symrcm(sparse(A))
spy(A[r,r])
title("Reverse Cuthill-McKee")
# 对称重新排序 - 列置换
使用 j = COLPERM(A) 可返回一个置换向量,该向量以非零计数的非递减顺序对稀疏矩阵 A 的各列进行重新排序。此方法有时很有用,可作为对 LU 分解的预排序方法,如 lu(A[:,j])。
j = colperm(sparse(A))
spy(A[j, j])
title("Column Count Reordering")
# 对称重新排序 - 对称近似最小度
symamd 可以进行对称近似最小度置换。对于对称正定矩阵 A,命令 p = symamd(S) 返回置换向量 p,因此 S[p,p] 倾向于比 S 具有更稀疏的乔列斯基因子。有时 symamd 也适用于对称的非正定矩阵。
m = symamd(sparse(A))
spy(A[m, m])
title("Approximate Minimum Degree")
