Addition leads to `MethodError: no method matching +(::Array{Int64, 0}, ::Int64)`

Addition leads to `MethodError: no method matching +(::Array{Int64, 0}, ::Int64)`

我正在使用 Julia,我尝试测试一个函数,该函数创建图像并根据给定的字符串分配红色值。只要听到这句话,我相信你能想到我本可以做一百万件事来接收错误消息,但是这个错误:

在第 13 行生成。

这是第 13 行:

r = (i + 64*rand(0:3) - 1)/255

这只是数学! r 是我正在分配的新变量。 i 是数组中每个字符的索引。这似乎在控制台中有效,所以可能之前的代码中发生了一些奇怪的事情,只是没有被捕获。这是整个函数:

function generate(string, width)
  img = rand(RGB,width,floor(Int,length(string)/width) + 1)
  for n in 1:length(string)
    i = indexin(string[n], alphabet)
    r = (i + 64*rand(0:3) - 1)/255
    g = img[n].g
    b = img[n].b
    img[n] = RBG(r,g,b)
  end
  return img
end

有谁知道这条错误消息是什么意思,或者我做错了什么?

你这里的i不是一个整数,它是一个数组。 indexin 用于查找数组中每个元素在另一个数组中的位置;只找到一个您可能想要的元素 findfirst:

julia> findfirst(isequal('c'), collect("abcde"))
3

julia> indexin(collect("cab"), collect("abcde"))
3-element Vector{Union{Nothing, Int64}}:
 3
 1
 2

julia> indexin('c', collect("abcde"))
0-dimensional Array{Union{Nothing, Int64}, 0}:
3

另请注意,如果它们找不到字母,这两者都会给出 nothing,您可能需要决定如何处理。 (可能用if else,你也可以用函数something。)

julia> indexin('z', collect("abcde"))
0-dimensional Array{Union{Nothing, Int64}, 0}:
nothing

julia> findfirst(isequal('z'), collect("abcde")) === nothing
true

最后,请注意,像这样索引字符串不是很可靠,您可能需要对其进行迭代:

julia> "cañon"[4]
ERROR: StringIndexError: invalid index [4], valid nearby indices [3]=>'ñ', [5]=>'o'

julia> for (n, char) in enumerate("cañon")
       @show n, char
       end
(n, char) = (1, 'c')
(n, char) = (2, 'a')
(n, char) = (3, 'ñ')
(n, char) = (4, 'o')
(n, char) = (5, 'n')