繁体   English   中英

Julia:我们可以在不可变结构类型中更改对象多少?

[英]Julia: How much can we change the objects in immutable struct type?

我有一个不可变的结构,有四个对象定义如下:

struct FltFric
    muS::Array{Float64, 2}
    muD::Array{Float64, 2}
    Dc::Float64
    W::Array{Float64, 2}
end

muS = repmat([0.6], 100, 1) # Coefficient of static friction
muD = repmat([0.5], 100, 1) # Coefficient of dynamic friction
Dc = 0.1                     # Critical slip distance

FltFriction = FltFric(muS, muD, Dc, zeros(size(muS)))

我正在修改FltFric.muS的值如下:

FltFriction.muS[1:20] = 100

这很好用。 但是当我尝试修改W的值时

FltFriction.W = (FltFriction.muS - FltFriction.muD)./(FltFriction.Dc)

这给了我一个错误: type FltFric is immutable

为什么第一个语句在第二个语句出错时没有给出错误? 如果类型是不可变的,则两个语句都应该给出错误。 这两项任务有什么区别?

我知道我可以通过键入mutable struct来规避问题,但我不明白我的两个任务的区别。

我不是朱莉娅专家,但我认为这是一个更普遍的问题。

在第一个赋值中,您将修改列表FltFriction.muS某些元素。 这很好,因为尽管结构是不可变的,但.muS引用的列表是可变的。 换句话说,您通过更改其元素而不是改变结构来改变列表。

在第二个任务中,你试图一举取代整个列表.W 在这种情况下,您试图直接改变结构,替换其中一个元素。 因此,第二个分配失败,而第一个分配成功。

我在这里猜测,但我怀疑如果你试图做第二次任务:

FltFriction.W[1:end] = ...

那你就没事了,因为你改变了列表而不是结构。

正如评论者所指出的那样(见下文),Julia中有一种“更惯用(更高性能)”的方法来正确地执行此操作,并且不使用就地赋值运算符(整齐!)来改变结构本身:

FltFriction.W .= (FltFriction.muS - FltFriction.muD)./FltFriction.Dc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM