首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数修改参数Julia

函数修改参数Julia
EN

Stack Overflow用户
提问于 2018-11-19 15:05:49
回答 1查看 407关注 0票数 1

我有一种可变的合成型,

代码语言:javascript
运行
复制
 mutable struct MyType

      x::Array{Float64}

 end

我有一个函数我想把它修改到位,

代码语言:javascript
运行
复制
 function f(z::MyType)

      newx = z.x + 1
      z.x = newx

      return z

 end

这似乎不适用于更新z。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-19 15:46:14

z.x是一个数组,因此必须编写z.x .+ 1 (注意额外的点)来表示元素级的加法。

代码语言:javascript
运行
复制
function f(z::MyType)
      newx = z.x .+ 1
      z.x = newx
      return z
 end

此函数确实更新了z

代码语言:javascript
运行
复制
julia> z = MyType(rand(1:10, 4))
MyType([10.0, 7.0, 2.0, 2.0])

julia> f(z)
MyType([11.0, 8.0, 3.0, 3.0])

julia> z
MyType([11.0, 8.0, 3.0, 3.0])

julia> @btime f($z);
  886.115 ns (4 allocations: 208 bytes)

分配(至少)是从以下事实来理解的:它分配了一个新的数组newx (每个元素都增加一个的z.x副本),然后将其设置为分配给z.x的新数组。以前分配给z.x的原始数组现在丢失了(并将被gc‘’ed)。

您可能想要做的是修改分配给z.x就地的数组,而不创建中间数组。这可以通过编写

代码语言:javascript
运行
复制
function f(z::MyType)
      z.x .= z.x .+ 1 # or equivalently z.x .+= 1
      return z
end

注意.=,而不是=,它分配在适当的位置(您可以想到一个元素级的赋值)。这给了我们

代码语言:javascript
运行
复制
julia> @btime f($z);
  372.284 ns (2 allocations: 48 bytes)

请注意,您也可以写得更短。

代码语言:javascript
运行
复制
f(z::MyType) = (z.x .+= 1; z)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53377438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档