Julia-控制台的行为与include(“myfile.jl”)不同

Julia-控制台的行为与include(“myfile.jl”)不同,julia,Julia,我想执行以下代码,当我在Windows 10上的Julia控制台中键入每一行时,该代码都能很好地工作,但由于类型LinearAlgebra不匹配而引发错误 代码如下: 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,数

我想执行以下代码,当我在Windows 10上的Julia控制台中键入每一行时,该代码都能很好地工作,但由于类型LinearAlgebra不匹配而引发错误

代码如下:

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,数组{Float64,2}}而不是数组{Float64,2}

如何进行转置并获得普通数组{Float64,2}对象

当我在Julia控制台中键入每一行时,为什么会这样做?而当我通过includemyfile.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            
使用“收集”可获得实际数据的副本,而不是原始数据的转换视图。请注意,此规则适用于许多其他类似情况:

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            
要获取法线矩阵{Float64},请使用:

这两个函数通常不是100%等价的,因为fx'是递归伴随运算共轭转置,而置换ims是非递归转置,但在您的例子中,它们将给出相同的结果

递归伴随的确切含义是什么

递归:共轭转置递归地应用于数组的所有条目,如果你有一个数字数组,一个数字的转置是同一个数字,所以这不会改变任何东西; 伴随:如果你有复数,那么这个运算会返回它们的复数共轭,在你有实数的情况下,所以这不会改变任何东西; 以下是两件事都很重要的一个例子:

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::Array{Float64,2}, fy::Array{Float64,2}
不仅在从脚本运行时,Julia命令行中还会抛出错误。

要获取标准矩阵{Float64},请使用:

这两个函数通常不是100%等价的,因为fx'是递归伴随运算共轭转置,而置换ims是非递归转置,但在您的例子中,它们将给出相同的结果

递归伴随的确切含义是什么

递归:共轭转置递归地应用于数组的所有条目,如果你有一个数字数组,一个数字的转置是同一个数字,所以这不会改变任何东西; 伴随:如果你有复数,那么这个运算会返回它们的复数共轭,在你有实数的情况下,所以这不会改变任何东西; 以下是两件事都很重要的一个例子:

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::Array{Float64,2}, fy::Array{Float64,2}

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

这是一个很好的解决方案,而且应该确保fx“真的满足了他们的期望,如果真的需要实现fx”,正如我在回答中所述。谢谢,这正是我想要的!:-这是一个很好的解决方案,但应确保fx“真的满足了他们的期望,如果真的需要实现fx”,正如我在回答中所概述的那样。谢谢,这正是我想要的!:-