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

如何解决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

所以我生成了 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 的值迭代执行该函数

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?