维度(N 行)x(M 列)的稀疏矩阵最多具有 NxM 个分量,可以使用 K=[0,N*M) 整数集进行索引。对于 K 中的任何 k,您可以检索元素索引 (i,j),这要归功于欧几里德除法 k = i + j*N(此处为列主要布局)。
要随机采样 K 的 n 个元素(不重复),可以使用 Knuth 算法“算法 S(选择采样技术)”3.4.2,在其书 Vol2., seminumerical-Algorithms
在朱莉娅:
function random_select(n::Int64,K::Int64)
@assert 0<=n<=K
sample=Vector{Int64}(n)
t=Int64(0)
m=Int64(0)
while m<n
if (K-t)*rand()>=n-m
t+=1
else
m+=1
sample[m]=t
t+=1
end
end
sample
end
下一部分简单地检索 I,J 索引以从其坐标形式创建稀疏矩阵:
function create_sparseMatrix(n::Int64,N::Int64,M::Int64)
@assert (0<=N)&&(0<=M)
@assert 0<=n<=N*M
nonZero = random_select(n,N*M)
# column major: k=i+j*N
I = map(k->mod(k,N),nonZero)
J = map(k->div(k,N),nonZero)
sparse(I+1,J+1,ones(n),N,M)
end
使用示例:一个 4x5 稀疏矩阵,在随机位置有 3 个非零 (=1.0):
julia> create_sparseMatrix(3,4,5)
4×5 SparseMatrixCSC{Float64,Int64} with 3 stored entries:
[4, 1] = 1.0
[3, 2] = 1.0
[3, 3] = 1.0
边界案例测试:
julia> create_sparseMatrix(0,4,5)
4×5 SparseMatrixCSC{Float64,Int64} with 0 stored entries
julia> create_sparseMatrix(4*5,4,5)
4×5 SparseMatrixCSC{Float64,Int64} with 20 stored entries:
[1, 1] = 1.0
[2, 1] = 1.0
[3, 1] = 1.0
[4, 1] = 1.0
⋮
[4, 4] = 1.0
[1, 5] = 1.0
[2, 5] = 1.0
[3, 5] = 1.0
[4, 5] = 1.0