gpt4 book ai didi

julia - 当我尝试使用矩阵作为字段创建复合类型时堆栈溢出

转载 作者:行者123 更新时间:2023-12-04 22:39:31 24 4
gpt4 key购买 nike

在下面的代码中,我有一个复合类型,在我的实际代码中,有几个字段是矩阵。在这个例子中只有 1。当我尝试构造复合类型时,我一直在堆栈溢出。这是代码示例:

struct Tables
eij::Array{Float64,2}
end

Tables(eij::Array{Float64,2}) = Tables(eij) # works if this is commented out
x = 5 # arbitrary matrix dimension
e_ij = Array{Float64,2}(undef,x,x)

for i=1:x
for j=1:x
e_ij[i,j] = i*j/2.3 #dummy numbers, but not the case in real code
end
end

vdwTable = Tables([e_ij[i,j] for i=1:x,j=1:x])

我使用临时变量 e_ij首先制作矩阵,因为我不想要复合 Tables是可变的。所以,我的推理是首先在虚拟变量中生成表,如 e_ij ,然后我可以初始化不可变 Tables我真正想要的。

如果我注释掉 struct Tables 的外部构造函数有用。但是,对于不同字段未传递要初始化的数据的情况,我实际上希望有几个不同的外部构造函数。在这些情况下,我想给他们默认矩阵。

我得到的错误如下: ERROR: LoadError: StackOverflowError:
线路 vdwTable = Tables([e_ij[i,j] for i=1:x,j=1:x])

最佳答案

定义复合类型时,会自动定义内部构造函数,因此:

struct Tables
eij::Array{Float64,2}
end

相当于:
struct Tables
eij::Array{Float64,2}
Tables(eij::Array{Float64,2}) = new(eij)
end

当你定义这个外部构造函数时
Tables(eij::Array{Float64,2}) = Tables(eij)

你妨碍了内部构造函数。您的外部构造函数只是递归调用自身,直到出现堆栈溢出。

另一方面,这样做,
Tables(eij) = Tables(eij)

实际上相当于:
Tables(eij::Any) = Tables(eij)

所以当你随后打电话
vdwTable = Tables([e_ij[i,j] for i=1:x,j=1:x])

然后它会忽略您的外部构造函数,因为有一个更具体的方法匹配,即内部构造函数。所以那个特定的外部构造函数是非常无用的,它要么被忽略,要么递归直到堆栈溢出。

最简单的解决方案是:不要创建外部构造函数。如果确实需要外部构造函数来强制执行某些条件,请确保它不会因为具有相同的类型签名而遮蔽内部构造函数。例如,
Tables() = Tables(zero(5, 5))

应该管用。

不过,我可能会这样做:
struct Tables
eij::Array{Float64,2}
Tables(eij=zeros(5, 5)) = new(eij)
end

对于你的第二个例子,有两个字段,你可以试试这个:
struct Tables
eij::Array{Float64,2}
sij::Array{Float64,2}
Tables(eij=zeros(5,5), sij=zeros(5,5)) = new(eij, sij)
end

您的输入将转换为 Float64矩阵,如果可能,否则将引发异常。

关于julia - 当我尝试使用矩阵作为字段创建复合类型时堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54528583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com