我想执行下面的代码,当我在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命令行中也抛出一个错误(不仅在从脚本运行时(。