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

Julia 错误:MethodError:没有与abs匹配的方法(::数组{Complex{Float64},1}),julia,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.^comp

假设我们有这个函数:

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
让我们试着忽略这个函数中的一些变量,因为问题与它们无关,我在这里面临的问题是,当我调用这个函数时,顺便说一下,它是一个intern函数,我得到以下错误:

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)^2
coef
nab
是系数类型
Int
omega
也是
Int
,如果我在一个简单的情况下尝试相同的操作,它会工作,但在这里我不知道为什么

total
似乎是复数的
向量,而
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

total
似乎是复数的
向量,而
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

omega
可能不是整数。将
@show typeof(omega)
放在
abs
调用之前以确认这一点。显然,
total*omega
是一个向量,您不能取向量的
abs
。你期望它是一个标量吗?函数中几乎没有定义任何变量,请提供可运行的代码。
omega
ist可能不是整数。将
@show typeof(omega)
放在
abs
调用之前以确认这一点。显然,
total*omega
是一个向量,您不能取向量的
abs
。你期望它是一个标量吗?函数中几乎没有定义任何变量,请提供可运行的代码。请务必使用
abs2.(cnums)
而不是
abs.(cnums)。^2
。在某些情况下,性能差异是惊人的,因为
abs2
可以模拟,而
abs
不能模拟。而且它更简单。也可能是
omega
是一个向量(一个全局向量),因为
total
是在一个函数中定义的,它是一个标量。作为额外的广播清理,最好编写
abs2.(cnums.*1)
来使用广播融合-这样的代码应该运行得更快。很抱歉,由于某种原因,我无法回答您的建议,在我使用
abs2
修复此问题后,我又遇到了一个错误,显然,它在for循环中引发:
BoundsError:尝试访问索引[1]处的0元素数组{JuMP.Variable,1}
,为了进一步解释,在另一个函数中创建了一个名为
x
的变量,该函数使用
Clp
,使用
通道
@Variable(m,x[1:level]调用)
使用此约束:
@约束(m,con,A*x.>=0)
我真的不知道如何解决此问题。也许您有一个大小为
0
的变量?可能
级别=0
?也许你应该用优化代码做一个MWE,并将其作为一个单独的问题发布?一定要使用
abs2.(cnums)
而不是
abs.(cnums)。^2
。在某些情况下,性能差异是惊人的,因为
abs2
可以模拟,而
abs
不能模拟。而且它更简单。也可能是
omega
是一个向量(一个全局向量),因为
total
是在一个函数中定义的,它是一个标量。作为额外的广播清理,最好编写
abs2.(cnums.*1)
来使用广播融合-这样的代码应该运行得更快。很抱歉,由于某种原因,我无法回答您的建议,在我使用
abs2
修复此问题后,我又遇到了一个错误,显然,它在for循环中引发:
BoundsError:尝试访问索引[1]处的0元素数组{JuMP.Variable,1}
,为了进一步解释,在另一个函数中创建了一个名为
x
的变量,该函数使用
Clp
,使用
通道
@Variable(m,x[1:level]调用)
使用此约束:
@约束(m,con,A*x.>=0)
我真的不知道如何解决此问题。也许您有一个大小为
0
的变量?可能
级别=0
?也许您应该用优化代码制作一个MWE,并将其作为一个单独的问题发布?