朱莉娅 - 控制台的行为与包含("myfile.jl" ) 不同



我想执行下面的代码,当我在Windows 10上的Julia控制台中键入每一行时,它都能很好地工作,但由于类型LinearAlgebra.Adjoint{Float64,Array{Float64,2}}不匹配而引发错误(我的后续代码需要Array{Float64,2}(。

这是代码:

x = [0.2, 0.1, 0.2]
y = [-0.5 0.0 0.5]
fx = x * y
fy = fx'
return fx::Array{Float64,2}, fy::Array{Float64,2}

存在TypeError,因为fy的类型似乎是LinearAlgebra.Adjoint{Float64,Array{Float64,2}}而不是Array{Float64,2}

如何进行转置并获得"正常"数组{Float64,2}对象?

为什么当我在Julia控制台中键入每一行时都能工作,而当我通过include("myfile.jl"(运行文件时却不能工作?

使用collect可以获得实际数据的副本,而不是原始数据的转换视图(请注意,此规则适用于许多其他类似情况(:

julia> x = [0.2, 0.1, 0.2];                         
julia> y = [-0.5 0.0 0.5];
julia> fx = x * y                                     
3×3 Array{Float64,2}:                                 
-0.1   0.0  0.1                                      
-0.05  0.0  0.05                                     
-0.1   0.0  0.1                                      
julia> fy = fx'                                       
3×3 LinearAlgebra.Adjoint{Float64,Array{Float64,2}}:  
-0.1  -0.05  -0.1                                    
0.0   0.0    0.0                                    
0.1   0.05   0.1                                    
julia> fy = collect(fx')                              
3×3 Array{Float64,2}:                                 
-0.1  -0.05  -0.1                                    
0.0   0.0    0.0                                    
0.1   0.05   0.1            

要获得正常的Matrix{Float64},请使用:

fy = permutedims(fx)

fy = Matrix(fx')

这两者通常不是100%等价的,因为fx'是递归伴随运算(共轭转置(,而permutedims是非递归转置,但在您的情况下,它们会给出相同的结果。

递归伴随到底意味着什么?

  • 递归:共轭转置递归应用于数组的所有条目(在您的情况下,您有一个数字数组,并且一个数字的转置是相同的数字,所以这不会改变任何事情(
  • 伴随:如果你有复数,那么运算会返回它们的复数共轭(在你的情况下,你有实数,所以这不会改变任何事情(

这里有一个两件事都很重要的例子:

julia> x = [[im, -im], [1-im 1+im]]
2-element Array{Array{Complex{Int64},N} where N,1}:
[0+1im, 0-1im]
[1-1im 1+1im]
julia> permutedims(x)
1×2 Array{Array{Complex{Int64},N} where N,2}:
[0+1im, 0-1im]  [1-1im 1+1im]
julia> Matrix(x')
1×2 Array{AbstractArray{Complex{Int64},N} where N,2}:
[0-1im 0+1im]  [1+1im; 1-1im]

然而,除非你真的需要,否则如果你真的想得到数据的共轭转置,你就不必这么做。将类型断言更改为就足够了

return fx::Array{Float64,2}, fy::AbstractArray{Float64,2}

return fx::Matrix{Float64}, fy::AbstractMatrix{Float64}

共轭转置是为了避免不必要的数据分配而设计的,大多数时候这对你来说会更有效(尤其是对于大矩阵(。

最后一行:

return fx::Array{Float64,2}, fy::Array{Float64,2}

在Julia命令行中也抛出一个错误(不仅在从脚本运行时(。

最新更新