朱莉娅错误:没有方法匹配奇怪的行为

时间:2018-12-17 23:31:03

标签: julia

我是Julia的新人,REPL的回答对我来说似乎很奇怪:

当我运行此不正确代码时:

mat = [1 2 3; 4 5 6]

function minus(mat::Array{Int64,2}, min)::Array{UInt8,2}
    out = mat-min;
    # out = UInt8.(out);
    return out;
end

minmat = minus(mat);

我得到此正确错误消息:

ERROR: LoadError: MethodError: no method matching minus(::Array{Int64,2})
Closest candidates are:
  minus(::Array{Int64,2}, ::Any) at /home/hugo/dev/julia/test.jl:5

但是当我运行此正确(我想)代码时:

mat = [1 2 3; 4 5 6]

function minus(mat::Array{Int64,2}, min)::Array{UInt8,2}
    out = mat-min;
    # out = UInt8.(out);
    return out;
end

minmat = minus(mat, 1);

朱莉娅给我这个 不正确 错误消息:

ERROR: LoadError: MethodError: no method matching -(::Array{Int64,2}, ::Int64)
Closest candidates are:
  -(::Complex{Bool}, ::Real) at complex.jl:298
  -(::Missing, ::Number) at missing.jl:93
  -(::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
  ...

(请注意函数签名中的“-”)

我在文档中看不到与此相关的任何东西,所以我有点困惑,这就是为什么我要在这里询问。

2 个答案:

答案 0 :(得分:4)

方法错误并非针对您的minus函数,而是实际上由行out = mat-min生成。给定x::Matrix{Int}y::Int,Julia没有x - y的方法。要查看此内容,只需将以下内容粘贴到REPL中:

[1 2 ; 3 4] - 5

如果您想要的行为是从min的每个元素中减去mat,那么您真正想要做的就是广播min参数。也就是说,使用:

out = mat .- min

鉴于此更改,您的功能现在可以正常运行了。

答案 1 :(得分:4)

您尝试从数组中减去标量。您需要使用点运算符对该向量进行矢量化处理。

function minus(mat::Array{Int64,2}, min)::Array{UInt8,2}
    out = mat .- min;
    # out = UInt8.(out);
    return out;
end

现在运行此函数将产生:

julia> minmat = minus(mat, 1)
2×3 Array{UInt8,2}:
 0x00  0x01  0x02
 0x03  0x04  0x05

请注意,您希望参数为Array时,自变量是Int64中的UInt8。当值超出范围时,您的函数调用可以轻松地以InexactError结尾。