如何解决Julia,在函数中使用@views 的语法
我想构建一个函数,它遍历 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,1])] .= 4
它只是替换数组 Pop[end,1]
中的 33 -> 3 和 44 -> 4
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
的值迭代执行该函数
for (Orig,NewS) = ResetZip
ResetState(@view (Pop[end,1]),NewS)
end
但我收到此错误
ERROR: LoadError: ArgumentError: Invalid use of @view macro: argument must be a reference expression A[...].
所以我的语法有问题。我的问题是,我在哪里放置 @view
以获得正确的语法,能够使用它,并迭代 zip 文件的值?谢谢。 J
解决方法
这只是一般宏解析的一个怪癖。您可以用空格分隔宏的参数,也可以将其视为函数调用。你写过:
ResetState(@view (Pop[end,:,1]),Orig,NewS)
@view
和 (Pop...
之间的空格表示您选择了空格分隔机制。宏会很高兴地“吞噬”您打算用于 ResetState
的所有其他参数。换句话说,您有效地将 元组 传递给 @view
。如果我让 Julia 简单地“引用”该表达式,您就可以看到它是如何打印出来的——而且它是通过显式括号来实现的,这使得它更加明显:
julia> quote
ResetState(@view (Pop[end,NewS)
end
quote
#= REPL[5]:2 =#
ResetState(#= REPL[5]:2 =# @view((Pop[end,1],NewS)))
end
修复?删除该空间并在函数调用中使用宏时像函数一样调用它:
ResetState(@view(Pop[end,NewS)
,
@MattB. 的回答解释了宏观问题,但您首先将事情严重过度复杂化。没有必要像这样使用 @view
宏。而不是
(@view Pop[end,1])[findall(x -> x==33,Pop[end,1])] .= 3
你可以写
Pop[end,findall(x -> x==33,1] .= 3
但这也太复杂了。而不是这样,你可以写
Pop[end,1].==33,1] .= 3
但这也不必要地复杂化。您真正应该做的是使用 replace!
函数。不过,您必须再次使用 view
:
replace!(@view(Pop[end,3=>33)
现在您甚至可以同时进行两种替换:
replace!(@view(Pop[end,33=>3,44=>4)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。