Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
在Julia中实现LAPACK例程hseqr()(创建包装错误:没有与数组{Float64,1}(::Int64)匹配的方法)_Julia_Linear Algebra_Lapack_Eigenvalue - Fatal编程技术网

在Julia中实现LAPACK例程hseqr()(创建包装错误:没有与数组{Float64,1}(::Int64)匹配的方法)

在Julia中实现LAPACK例程hseqr()(创建包装错误:没有与数组{Float64,1}(::Int64)匹配的方法),julia,linear-algebra,lapack,eigenvalue,Julia,Linear Algebra,Lapack,Eigenvalue,我试图实现从LAPACK(link:)到Julia的hseqr()例程,但调用函数时出现以下错误: 错误:没有方法匹配数组{Float64,1}(::Int64) 这是我的代码: for (hseqr, elty) in ((:dhseqr_,:Float64), (:shseqr_,:Float32)) @eval begin """ JOB JOB is CHARACTER*1 = 'E':

我试图实现从LAPACK(link:)到Julia的hseqr()例程,但调用函数时出现以下错误:

错误:没有方法匹配数组{Float64,1}(::Int64)

这是我的代码:

for (hseqr, elty) in
    ((:dhseqr_,:Float64),
    (:shseqr_,:Float32))
    @eval begin
        """
     JOB    
          JOB is CHARACTER*1
           = 'E':  compute eigenvalues only;
           = 'S':  compute eigenvalues and the Schur form T.
    COMPZ   
          COMPZ is CHARACTER*1
           = 'N':  no Schur vectors are computed;
           = 'I':  Z is initialized to the unit matrix and the matrix Z
                   of Schur vectors of H is returned;
           = 'V':  Z must contain an orthogonal matrix Q on entry, and
                   the product Q*Z is returned.
        """
        function hseqr!(job::Char,compz::Char,ilo::Integer,ihi::Integer,H::StridedMatrix{$elty}, Z::StridedMatrix{$elty})
            N=size(H,1)
            ldh=size(H,1)
            ldz=size(Z,1)
            work = Vector{$elty}(1)
            lwork = BlasInt(-1)
            info = Ref{BlasInt}()
            for i = 1:2  # first call returns lwork as work[1]
                ccall((@blasfunc($hseqr), liblapack),Void,
                    (Ref{UInt8},Ref{UInt8}, Ref{BlasInt},Ref{BlasInt},Ref{BlasInt},
                        Ptr{$elty}, Ref{BlasInt},Ptr{$elty}, Ptr{$elty}, Ptr{$elty}, 
                        Ref{BlasInt}, Ptr{BlasInt}, Ref{BlasInt}, Ref{BlasInt}),
                        job,compz, N,ilo,ihi,H,ldh,wr,wi,Z,ldz,work, 
                        lwork,info) 
                chklapackerror(info[])
                if i == 1
                    lwork = BlasInt(real(work[1]))
                    resize!(work, lwork)
                end
            end
            return wr,wi,Z
        end
    end
end
hseqr!(job::Char,compz::Char,H::StridedMatrix{},Z::StridedMatrix{}) = hseqr!(job,compz,1, size(H, 1), H,Z)
这是我的电话:
hseqr!('E','N',H,矩阵{Float64}(I,5,5))
(H是维数为5的Hessenberg矩阵)


我不确定我是否正确理解如何制作包装,所以任何提示都会有所帮助

对于一个问题来说,这是一个很好的例子,这个问题可以通过精简一些来隔离问题而受益

如果我读对了你的代码,那行

work = Vector{$elty}(1)
使用
Float64
作为元素类型调用,因此整个过程归结为:

julia> Vector{Float64}(1)
ERROR: MethodError: no method matching Array{Float64,1}(::Int64)

您正在错误地使用向量的构造函数。现在我不确定您在这里要做什么,但是如果您要创建长度为1的
Float64
数字的向量,您可能要查找以下其中一个:

julia> Array{Float64}(undef, 1)
1-element Array{Float64,1}:
 6.9274314537094e-310

julia> zeros(1)
1-element Array{Float64,1}:
 0.0

请注意,第一次调用使数组未初始化,即数组中填充了以前内存中的任何内容,因此您希望确保仅在以后实际覆盖它时才使用它。

也许将类似于您的LAPACK包装器捆绑到一个包中,甚至将其集成到Julia本身中是有意义的。如果您能在代码可靠运行后,在GitHub上为此创建一个问题,那就太好了。