gpt4 book ai didi

multidimensional-array - Julia:制作自定义类型的空/初始化多维数组

转载 作者:行者123 更新时间:2023-12-04 08:41:49 25 4
gpt4 key购买 nike

我正在制作一种我自己的类型,称为 KeyVal定义如下:

type KeyVal
first::Int
second::Float64
end

我正在尝试创建一个空/或初始化为零的矩阵,其元素的类型为 KeyVal .
通常与我做的其他类型
myMat = zeros(KeyVal, (10,3))

但这行不通,因为没有 zeros为此复合类型定义。所以我尝试通过以下方式定义我自己的 zeros 函数:
import Base.zeros

function zeros(KeyVal,dims)
if length(dims) > 1
n=dims[1]
m=dims[2]
temp = repeat([KeyVal(0,0.0)], outer=m*n)
temp = reshape(temp, (n,m))
return temp
elseif length(dims) == 1
n=dims[1]
temp= repeat([KeyVal(0,0.0)], outer=n)
temp = reshape(temp, (n))
return temp
end
end

这将添加到其他先前定义的方法列表中 zeros .
但是使用它会产生错误:
myMat = zeros(KeyVal, (N,M))

MethodError: no method matching zero(::Type{KeyVal})
Closest candidates are:
.....

我想知道我是否可以通过某种方式解决这个问题,或者在类型构造函数中发出信号,以便任何涉及类型 KeyVal 的数据结构初始化为 (first = 0, second=0.0)。

以前我尝试将矩阵定义为:
myMat2 = Array{KeyVal,(N,M)}

这将创建一个矩阵,除了它的所有元素都是 #undef ,在这种情况下,我无法访问 myMat2 的任何元素:
myMat2[1,1]
UndefRefError: access to undefined reference

最佳答案

您可以创建任何类型的未初始化数组T和尺寸N

Array{T, N}(undef, dims...)

在一维和二维数组的特殊情况下,可以使用别名 VectorMatrix ,例如,
julia> m = Matrix{KeyVal}(undef, 2,2)
2×2 Array{KeyVal,2}:
#undef #undef
#undef #undef

然后,您可以像往常一样设置元素,例如,
m[1,2] = KeyVal(1,2)

如果你的类型实现 zero 有意义方法,你可以定义
Base.zero(::Type{KeyVal}) = KeyVal(0,0)

zeros将正常工作
julia> zeros(KeyVal, (2,2))
2×2 Array{KeyVal,2}:
KeyVal(0,0.0) KeyVal(0,0.0)
KeyVal(0,0.0) KeyVal(0,0.0)

警告:
zeros使用 fill!它用相同实例的副本填充数组。相反,使用下面的理解或不包含引用的不可变类型( isbits 为真)。后一种方法也可能更快,因为数组可以存储为一个连续的内存块。在这种情况下,您也可以使用 fill(KeyVal(0,0), dims..)直接而不是定义 zero .在 0.6 上,新的 struct关键字默认创建不可变类型。

编辑:

另一种可能性是使用理解
julia> m = [KeyVal() for i=1:3, j=1:2]
3×2 Array{KeyVal,2}:
KeyVal(0,0.0) KeyVal(0,0.0)
KeyVal(0,0.0) KeyVal(0,0.0)
KeyVal(0,0.0) KeyVal(0,0.0)

为方便起见,我之前定义了外部构造函数
KeyVal() = KeyVal(0,0)

关于multidimensional-array - Julia:制作自定义类型的空/初始化多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42836888/

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