Random 随机1'的Julia稀疏矩阵;s

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(此处为列主布局)检

所以我在julia中有一个大小为N的矩阵,我需要一个NxN稀疏矩阵,其中有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
permutes
1:N
唯一值。这是否保证不会重复使用相同的i,j元组?是的,它不会重复任何索引,因为
randperm
permutes
1:N
唯一值。