Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在Julia中将复向量转换为稀疏对角数组_Matlab_Julia_Sparse Matrix_Diagonal - Fatal编程技术网

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

Matlab 在Julia中将复向量转换为稀疏对角数组,matlab,julia,sparse-matrix,diagonal,Matlab,Julia,Sparse Matrix,Diagonal,试图在Julia中复制Matlab中的计算,但在将单列复数数组转换为稀疏对角化数组进行矩阵乘法时遇到了问题 以下是我试图在Julia中复制的Matlab代码: x*diag(sparse(y)) 其中,x的大小为60600000且类型为:双精度,y的大小为600000,1且类型为:复杂双精度。您可以使用对角线: using LinearAlgebra x=rand(6,60) y=rand(Complex{Float64},60,1) x*Diagonal(view(y,:)) 我使用了v

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

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

x*diag(sparse(y)) 

其中,
x
的大小为
60600000
且类型为:双精度,
y
的大小为
600000,1
且类型为:复杂双精度。

您可以使用
对角线

using LinearAlgebra
x=rand(6,60)
y=rand(Complex{Float64},60,1)
x*Diagonal(view(y,:))
我使用了
view(y,:)
y
转换为
Vector
-这是一个维度删除操作符,您也可以使用较短的
vec(y)
。根据您想要做的事情,您可能会明确地说您想要查看(y,:,1)的第一列


请注意,
对角线
只是矩阵的稀疏表示

julia> Diagonal(1:4)
4×4 Diagonal{Int64,UnitRange{Int64}}:
 1  ⋅  ⋅  ⋅
 ⋅  2  ⋅  ⋅
 ⋅  ⋅  3  ⋅
 ⋅  ⋅  ⋅  4
另一个可能涵盖更多用例场景的选项是
带状矩阵

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

请注意,
BandeMatrix
对频带使用一组对,其中频带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

我不知道这是否是故意的,但我对这种行为进行了备案。

在这种特殊情况下,
x.*y'
也会导致同样的结果,对吗?。将更好的东西作为基准是很有趣的。(祝贺10k!)您可以编写
对角线(vec(y))
而不是
对角线(查看(y,:)
vec
也是非分配的,但最终会得到更好的类型签名,而且更容易编写
vec
是一个非常好的函数。@phipsgabler谢谢
x.*y'
似乎返回了不同的结果。@DNF是的,我应该键入
vec(y)
,因为它较短,但每次我都会自动忘记;-)请注意,
对角线
带状矩阵
可以具有更高效的内存存储(因为它们明确知道数据结构,并且只支持此数据结构)。因此,
sparsearray
更加灵活,但这也必须带来显著的性能成本。