错误:MethodError:没有与abs(:: Array {Complex {Float64},1})相匹配的方法

时间:2019-12-14 13:06:52

标签: julia

假设我们具有以下功能:

function prob(na)
            @assert count(!iszero, ui2*na) == 0
            b = T0*na
            setc(-b)
            total = 0.0
            for x in Channel(scan)
                nab = vi2*x + b 
                total += prod([c.^complex(n)/factorial(n) for (c, n) in zip(coef, nab)])
            end
            return abs(total*omega)^2
        end

,让我们尝试忽略此函数中的某些变量,因为问题与它们无关,我在这里面临的问题是当我调用此函数(这是一个内部函数)时,出现以下错误:

ERROR: MethodError: no method matching abs(::Array{Complex{Float64},1})
Closest candidates are:
  abs(::Bool) at bool.jl:83
  abs(::Float16) at float.jl:520
  abs(::Float32) at float.jl:521
  ...

现在我知道错误出现在abs(total*omega)^2coefnab的系数类型为Int omega的同时也是{{1} },如果我在一个简单的情况下尝试相同的操作就可以了,但是在这里我不知道为什么!

1 个答案:

答案 0 :(得分:2)

total似乎是复数的Vector,而omega可能是一个标量。 因此,如果您使用do(.)运算符对操作进行向量化,可能就足够了。看看下面的代码:

julia> cnums = Complex.([2,2,3],[2,7,6])
3-element Array{Complex{Int64},1}:
 2 + 2im
 2 + 7im
 3 + 6im

julia> abs.(cnums .* 1).^2
3-element Array{Float64,1}:
  8.000000000000002
 53.0
 45.00000000000001

或者,最好由@DNF建议:

julia> abs2.(cnums .* 1)
3-element Array{Int64,1}:
  8
 53
 45