在 Julia 中将复杂向量转换为稀疏对角线数组

Converting a complex vector to a sparse diagonal array in Julia

尝试在 Julia 中复制 Matlab 的计算,但在将单列复数数组转换为用于矩阵乘法的稀疏对角化数组时遇到问题。

这是我试图在 Julia 中复制的 Matlab 代码:

x*diag(sparse(y)) 

其中 x 的大小为 60,600000,类型为:double,y 的大小为 600000,1,类型为:complex double。

你可以使用 Diagonal

using LinearAlgebra
x=rand(6,60)
y=rand(Complex{Float64},60,1)
x*Diagonal(view(y,:))

我已经使用 view(y,:)y 转换为 Vector - 这是一个维度下降运算符,您也可以使用更短的形式 vec(y) 代替。根据你想做什么,你可能会明确地说你想要 view(y,:,1).

的第一列

请注意 Diagonal 只是矩阵的稀疏表示。

julia> Diagonal(1:4)
4×4 Diagonal{Int64,UnitRange{Int64}}:
 1  ⋅  ⋅  ⋅
 ⋅  2  ⋅  ⋅
 ⋅  ⋅  3  ⋅
 ⋅  ⋅  ⋅  4

另一个可能涵盖更多用例场景的选项是 BandedMatrices:

using BandedMatrices
x*BandedMatrix(0=>view(y,:))

请注意,BandedMatrix 使用成对组作为波段,其中波段 0 实际上是对角线。

我猜你不是这个意思,但也可以用 y 是 Julia 意义上的稀疏向量的方式来解释这个问题,你想构造一个稀疏对角矩阵从它出来。在这种情况下,您可以执行以下操作:

julia> y = sprand(10, 0.2)
10-element SparseVector{Float64,Int64} with 2 stored entries:
  [4 ]  =  0.389682
  [5 ]  =  0.232429

julia> I, V = findnz(y)
([4, 5], [0.3896822408908356, 0.2324294021548845])

julia> sparse(I, I, V)
5×5 SparseMatrixCSC{Float64,Int64} with 2 stored entries:
  [4, 4]  =  0.389682
  [5, 5]  =  0.232429

不幸的是,spdiagm 不保留稀疏输入的结构零点:

julia> spdiagm(0 => y)
10×10 SparseMatrixCSC{Float64,Int64} with 10 stored entries:
  [1 ,  1]  =  0.0
  [2 ,  2]  =  0.0
  [3 ,  3]  =  0.0
  [4 ,  4]  =  0.389682
  [5 ,  5]  =  0.232429
  [6 ,  6]  =  0.0
  [7 ,  7]  =  0.0
  [8 ,  8]  =  0.0
  [9 ,  9]  =  0.0
  [10, 10]  =  0.0

我不知道这是否是故意的,但我已就此行为提交 an issue