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

问题描述

尝试从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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...