问题描述
尝试从Julia中的Matlab复制计算,但是在将单列复杂数组转换为稀疏对角线数组进行矩阵乘法时遇到困难。
这是我要在Julia中复制的Matlab代码:
x*diag(sparse(y))
其中x
的大小为60,600000
,类型为double;而y
的大小为600000,1
,类型为:double 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,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。