Юлия ошибка: ни один метод не соответствует странному поведению - PullRequest
0 голосов
/ 18 декабря 2018

Я новичок в Юлии, и ответы 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 голосов
/ 18 декабря 2018

Вы пытаетесь вычесть скаляр из массива.Вам необходимо векторизовать эту операцию с помощью оператора точки.

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, когда значения выйдут за пределы.

0 голосов
/ 18 декабря 2018

Ошибка метода не для вашей функции minus, но фактически генерируется строкой out = mat-min.Учитывая x::Matrix{Int} и y::Int, у Юлии нет метода для x - y.Чтобы увидеть это, просто вставьте следующее в свой REPL:

[1 2 ; 3 4] - 5

Если вы хотите вычесть min из каждого элемента mat, то вы действительно хотите передатьmin аргумент.То есть используйте:

out = mat .- min

С учетом этого изменения ваша функция теперь будет работать так, как я подозреваю, что вы предполагали.

...