Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 朱莉娅';s@。宏和二进制运算符_Julia - Fatal编程技术网

Julia 朱莉娅';s@。宏和二进制运算符

Julia 朱莉娅';s@。宏和二进制运算符,julia,Julia,据我所知,以下内容应该是等效的: julia> rand(2).^2 2-element Array{Float64,1}: 0.164246 0.47107 julia> @. rand(2)^2 ERROR: DimensionMismatch("Cannot multiply two vectors") Stacktrace: [1] power_by_squaring(::Array{Float64,1}, ::Int64) at ./intfuncs.jl:169

据我所知,以下内容应该是等效的:

julia> rand(2).^2
2-element Array{Float64,1}:
 0.164246
 0.47107 

julia> @. rand(2)^2
ERROR: DimensionMismatch("Cannot multiply two vectors")
Stacktrace:
 [1] power_by_squaring(::Array{Float64,1}, ::Int64) at ./intfuncs.jl:169
 [2] broadcast(::##65#66) at ./sysimg.jl:86
这一条也是如此:

julia> 1./rand(2)
2-element Array{Float64,1}:
 1.93886
 3.01834

julia> @. 1/rand(2)
ERROR: MethodError: no method matching /(::Int64, ::Array{Float64,1})
Closest candidates are:
  /(::PyCall.PyObject, ::Any) at /home/simon/.julia/v0.6/PyCall/src/pyoperators.jl:11
  /(::Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8}, ::Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8}) at int.jl:38
  /(::Union{Int16, Int32, Int64, Int8, UInt16, UInt32, UInt64, UInt8}, ::BigInt) at gmp.jl:381
  ...
Stacktrace:
 [1] broadcast(::##69#70) at ./sysimg.jl:86
我到底做错了什么

帮助?>@

@。expr

将expr中的每个函数调用或运算符转换为“点调用” (例如,将
f(x)
转换为
f(x)
),并将expr中的每个作业转换为 “点分配”(例如,将
+=
转换为
+=

如果要避免在中为所选函数调用添加点 expr,使用
$
拼接这些函数调用

例如,
@。sqrt(abs($sort(x)))
相当于
sqrt.(abs.(sort(x)))
(没有点表示 排序)

问题是,通过这种方式,您也在广播
rand
。宏可用于所有函数调用,包括二进制运算符调用(即
1+1
解析为
+(1,1)

  • 使用
    @macroexpand
    宏查看宏调用产生的表达式

  • 插入您不想用
    @.
    广播的函数调用(
    $(f(x))

  • julia>@macroexpand@。兰特(2)^2
    :(^.(兰特)(2),2))#与:兰特(2)相同。^2
    朱莉娅>评估(ans)
    错误:维度不匹配(“无法乘以两个向量”)
    朱莉娅>@macroexpand@$(兰特(2))^2
    :(^.(兰特(2),2))#与:兰特(2)相同。^2
    朱莉娅>评估(ans)
    二元数组{Float64,1}:
    0.26266
    0.326033
    朱莉娅>@macroexpand@。1/兰特(2)
    :(/(1,兰特(2)))#与:1/兰特(2)相同
    朱莉娅>评估(ans)
    错误:MethodError:没有方法匹配/(::Int64,::数组{Float64,1})
    朱莉娅>@macroexpand@。1/$(兰特(2))
    :(/(1,兰特(2))#与:1/兰特(2)相同
    朱莉娅>评估(ans)
    二元数组{Float64,1}:
    37.1023
    1.08004
    
    不是答案,但请注意,
    1./rand(2)
    是不明确的。它可以表示
    1./兰特(2)
    1./rand(2)
    。第一个会抛出错误,第二个做你想做的。一个很好的解释。我认为值得补充的是,问题在于,例如
    exp.(rand.(2))
    失败,因为它相当于
    broadcast(x->exp(rand(x)),2)
    ,在这种表示中,很明显,此代码将抛出错误。