我想生成一个矩阵,每一行和每一列中只有一个非零条目,其中每个非零条目的模数为一。朱莉娅有什么办法吗?
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 包文档
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