我是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
...
(请注意函数签名中的“-”)
我在文档中看不到与此相关的任何东西,所以我有点困惑,这就是为什么我要在这里询问。
答案 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
结尾。