如何随机生成有符号置换矩阵

问题描述 投票:0回答:2

我想生成一个矩阵,每一行和每一列中只有一个非零条目,其中每个非零条目的模数为一。朱莉娅有什么办法吗?

matrix julia linear-algebra numerical-methods
2个回答
2
投票
n

个非零条目,因此它将是稀疏的。所以它也可能生成为稀疏矩阵:

using SparseArrays, Random

randspermmat(n) = SparseMatrixCSC(n, n,
  collect(1:n+1), shuffle(1:n), (-1).^rand(Bool,n))

使用示例:

julia> randspermmat(5) 5×5 SparseMatrixCSC{Int64, Int64} with 5 stored entries: ⋅ ⋅ 1 ⋅ ⋅ ⋅ 1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ 1 -1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ -1 ⋅

在存储方面,这比全矩阵要好得多,并且矩阵越大,生成速度也越好。

添加:这很常见,可以出现在另一个包中

LuxurySparse.jl

,甚至可以有更简单的定义:

using LuxurySparse, Random

randspermmat_alt(n) =
  PermMatrix(shuffle(1:n),(-1).^rand(Bool,n))

这个包更加高效,可能值得一看,具体取决于所需的优化。链接:
LuxurySparse 包文档


1
投票
shuffle

行索引并根据打乱的行索引将 (1,-1) 随机放置在每列中。

function bipolar(siz)
    m = n = siz
    A = zeros(Int,m,n)
    rowind = shuffle(1:m)
    for (j,i) in enumerate(rowind)
        A[i,j] = rand((-1,1))
    end
    A 
end

运行示例:

bipolar(5) 5×5 Matrix{Int64}: 0 0 1 0 0 0 0 0 0 1 0 0 0 -1 0 1 0 0 0 0 0 1 0 0 0

© www.soinside.com 2019 - 2024. All rights reserved.