Random 随机1'的Julia稀疏矩阵;s
所以我在julia中有一个大小为N的矩阵,我需要一个NxN稀疏矩阵,其中有N个,在随机的地方。最好的办法是什么Random 随机1'的Julia稀疏矩阵;s,random,julia,sparse-matrix,Random,Julia,Sparse Matrix,所以我在julia中有一个大小为N的矩阵,我需要一个NxN稀疏矩阵,其中有N个,在随机的地方。最好的办法是什么 起初我想随机生成索引,然后在稀疏矩阵中将这些数字设置为1,但最近我发现了sprand函数,但我不知道如何正确使用它们或将它们应用于我的问题。我在有限的理解下尝试使用它,但它不断生成错误消息。当然,非常感谢您的帮助:)维度(N行)x(M列)的稀疏矩阵最多有NxM个组件,可以使用K=[0,N*M)整数集对其进行索引。对于K中的任何K,都可以通过欧几里德除法K=i+j*N(此处为列主布局)检
起初我想随机生成索引,然后在稀疏矩阵中将这些数字设置为1,但最近我发现了sprand函数,但我不知道如何正确使用它们或将它们应用于我的问题。我在有限的理解下尝试使用它,但它不断生成错误消息。当然,非常感谢您的帮助:)维度(N行)x(M列)的稀疏矩阵最多有NxM个组件,可以使用K=[0,N*M)整数集对其进行索引。对于K中的任何K,都可以通过欧几里德除法K=i+j*N(此处为列主布局)检索元素索引(i,j) 要对K的n个元素进行随机采样(无重复),您可以在其书中使用Knuth算法“算法S(选择采样技术)”3.4.2 在朱莉娅:
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
边界案例测试:
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
维度(N行)x(M列)的稀疏矩阵最多有NxM分量,可以使用K=[0,N*M)整数集对其进行索引。对于K中的任何K,都可以通过欧几里德除法K=i+j*N(此处为列主布局)检索元素索引(i,j) 要对K的n个元素进行随机采样(无重复),您可以在其书中使用Knuth算法“算法S(选择采样技术)”3.4.2 在朱莉娅:
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
边界案例测试:
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
坚持一线式解决方案:
using StatsBase
sparseones(N,M,K) = sparse(
(x->(first.(x).+1,last.(x).+1))(divrem.(sample(0:N*M-1,K,replace=false),M))...,
ones(K),N,M
)
给予:
julia> sparseones(3,4,5)
3×4 SparseMatrixCSC{Float64,Int64} with 5 stored entries:
[1, 1] = 1.0
[2, 1] = 1.0
[3, 3] = 1.0
[2, 4] = 1.0
[3, 4] = 1.0
该方法基本上与前面的答案相同,优点是重复使用现有的
样本
,并且要短得多。在较大的矩阵上,该方法甚至更快。坚持一行式解决方案:
using StatsBase
sparseones(N,M,K) = sparse(
(x->(first.(x).+1,last.(x).+1))(divrem.(sample(0:N*M-1,K,replace=false),M))...,
ones(K),N,M
)
给予:
julia> sparseones(3,4,5)
3×4 SparseMatrixCSC{Float64,Int64} with 5 stored entries:
[1, 1] = 1.0
[2, 1] = 1.0
[3, 3] = 1.0
[2, 4] = 1.0
[3, 4] = 1.0
此方法本质上与前面的答案相同,优点是重复使用现有的
样本
,并且更短。在更大的矩阵上速度更快。受上面@DanGetz注释的启发,下面的解决方案是使用randperm
的单行函数。我删除了原始答案,因为它不是很好有帮助
sparseN(N) = sparse(randperm(N), randperm(N), ones(N), N, N)
这也非常快:
@time sparseN(10_000);
0.000558 seconds (30 allocations: 782.563 KiB)
受上面@DanGetz注释的启发,下面的解决方案是一个使用
randperm
的单行函数。我删除了原始答案,因为它不是很有用
sparseN(N) = sparse(randperm(N), randperm(N), ones(N), N, N)
这也非常快:
@time sparseN(10_000);
0.000558 seconds (30 allocations: 782.563 KiB)
sprand
…sparse(rand(1:N,N),rand(1:N,N),one(N),N,N)
可以做到这一点。这并不总是有效,因为你可以将一些(i,j)重复几次,从而得到一个非零元素少于预期的矩阵。正确。添加了一个更复杂的答案,但解决了问题。sprand
sparse(rand>…sparse(rand>)(1:N,N),rand(1:N,N),one(N),N,N)
就可以了这并不总是有效的,因为你可以得到一些(i,j)重复几次,从而得到一个非零元素少于预期的矩阵。正确。添加了一个更复杂但解决了问题的答案。这是否保证不会重复使用相同的i,j元组?是的,它不会重复任何索引,因为randperm
permutes1:N
唯一值。这是否保证不会重复使用相同的i,j元组?是的,它不会重复任何索引,因为randperm
permutes1:N
唯一值。