Function Julia,在函数中使用@views的语法

Function Julia,在函数中使用@views的语法,function,iteration,julia,Function,Iteration,Julia,我想构建一个函数,它遍历Julia zip文件的值,并替换大型3d数组中的一些值。在之前的帮助中,有人建议使用@view,我非常喜欢回写数组的原始部分,而不是复制。如果这是一个很好的方法,我很乐意接受建议,那么我无法找出利用@view的函数的正确语法。这是一个演示: 在最终的应用程序中,运行良好的原始代码将更多 (@view Pop[end, :, 1])[findall(x -> x==33, Pop[end, :, 1])] .= 3 (@view Pop[end, :, 1])[fi

我想构建一个函数,它遍历Julia zip文件的值,并替换大型3d数组中的一些值。在之前的帮助中,有人建议使用@view,我非常喜欢回写数组的原始部分,而不是复制。如果这是一个很好的方法,我很乐意接受建议,那么我无法找出利用@view的函数的正确语法。这是一个演示:

在最终的应用程序中,运行良好的原始代码将更多

(@view Pop[end, :, 1])[findall(x -> x==33, Pop[end, :, 1])] .= 3
(@view Pop[end, :, 1])[findall(x -> x==44, Pop[end, :, 1])] .= 4
它只是在数组Pop[end,:,1]中替换33->3和44->4

因此,我生成了zip文件:

Orig = [44, 33];
NewS = [4 , 3];
ResetZip = zip(Orig,NewS)
然后生成函数:

## Function to reset status numbers back from 44 and 33 to 4 and 3
function ResetState(Arr1, Orig, NewS)
    Arr1[findall(x -> x==Orig, Arr1)] .= NewS
end
然后尝试在ResetZip的值上迭代执行该函数

但是我得到了这个错误

ERROR: LoadError: ArgumentError: Invalid use of @view macro: argument must be a reference expression A[...].

所以我的语法有点错误。我的问题是,我应该把@view放在哪里来获得正确的语法,以便能够使用它,并迭代zip文件的值?谢谢。这通常只是宏解析的一个怪癖。可以用空格分隔宏的参数,也可以将其视为函数调用。你写过:

ResetState(@view (Pop[end, :, 1]), Orig, NewS)
@view和Pop之间的空间。。。意味着您选择了空间分隔机制。宏将很高兴地吞下您打算用于ResetState的所有其他参数。换句话说,您实际上是在向@view传递一个元组。如果我让Julia简单地引用这个表达式,你可以看到它是如何打印出来的——它使用显式括号,使它更加明显:

julia> quote
         ResetState(@view (Pop[end, :, 1]), Orig, NewS)
       end
quote
    #= REPL[5]:2 =#
    ResetState(#= REPL[5]:2 =# @view((Pop[end, :, 1], Orig, NewS)))
end
修复?在函数调用中使用宏时,请删除该空格并像调用函数一样调用宏:

ResetState(@view(Pop[end, :, 1]), Orig, NewS)

@MattB的回答解释了宏观问题,但首先你把事情严重复杂化了。没有必要像这样使用@view宏。而不是

(@view Pop[end, :, 1])[findall(x -> x==33, Pop[end, :, 1])] .= 3
你可以写

Pop[end, findall(x -> x==33, Pop[end, :, 1]), 1] .= 3
Pop[end, Pop[end, :, 1].==33, 1] .= 3
但这也太复杂了。相反,你可以写

Pop[end, findall(x -> x==33, Pop[end, :, 1]), 1] .= 3
Pop[end, Pop[end, :, 1].==33, 1] .= 3
但这也是不必要的复杂。你真正应该做的是使用替换!作用但是,您必须再次使用视图:

现在您甚至可以同时进行两次更换:

replace!(@view(Pop[end, :, 1]), 33=>3, 44=>4)

谢谢你,马特。只是了解到朱莉娅来自R,所以没有意识到空白有什么不同,吸取了教训,真的很感激。Quote函数会很有用。是的,有一些地方空白很重要-宏只有一个。Pop[end,:,1]。==33仍然可以受益于前面某处的@views,或者@viewPop[end,:,1]。==33。但是@viewPop,end,:,1内替换!不起作用,宏需要作用于索引表达式。或者函数viewPop,100,:,1接受这些参数,但不接受end@viewPop,end,:,1,33=>3,44=>4错误:语法:意外结束我做错什么了吗?那么,我们是否有一个解决方案,可以在一行代码中使用一个函数进行多次替换?@JimMaas请参阅我刚才的编辑。@view宏需要一个索引表达式。我现在看不出已经进行了什么编辑,但我确定我只使用了带有宏形式和索引括号的end,因为我一开始做错了,然后修复了它。。奇怪。这似乎很有效,非常简单和优雅,多谢。