Julia中用户定义的类型用于“标记”目的

时间:2018-03-22 12:45:50

标签: arrays types julia user-defined-types

在我的代码中,我需要跟踪两种数据项,即原始数据项和转换后的数据项。 原始数据项和已转换数据项都存储为Array{Float64,1}。 但是,我需要跟踪数据项是否是已转换的数据项,因为我的代码中的某些函数使用原始数据项,而某些函数则使用已转换的数据项。

为了确保正确性并避免将转换后的数据项传递给应该使用原始数据项的函数,我想我可以创建一个名为Transformed的类型。此类型可以在函数声明中使用,从而强制执行正确性。

当然,我查看了文档,但这对我没有帮助。 我想我需要做的是:

primitive type Transformed :< Array{Float64,1} end

但当然这不起作用(它甚至不是原始的!)

我必须去结构吗?有什么建议?欢呼声。

2 个答案:

答案 0 :(得分:3)

是的,您可能希望structmutable struct包含Array{Float64, 1}。您可以在关于复合类型(即结构)的Julia手册部分中了解有关这些内容的更多信息:https://docs.julialang.org/en/stable/manual/types/#Composite-Types-1

一个简单的例子是:

struct Transformed
  data::Array{Float64, 1}
end

答案 1 :(得分:0)

如果您不想使用.data字段访问阵列,可以考虑使用StaticArrays。可能还有一些其他已经存在的数据结构,但这是我能想到的第一个。

您可以使用SVectorwith some macros声明这些内容。这样做的好处是,您可以非常轻松地检查数组是静态数组还是常规数组,但您可以将它们用作常规数组。

julia> using StaticArrays

julia> original_array = SVector(1.5,2,3)
3-element StaticArrays.SArray{Tuple{3},Float64,1,3}:
 1.5
 2.0
 3.0

julia> transformed_array = Array{Float64,1}(original_array + 1.3)
3-element Array{Float64,1}:
 2.8
 3.3
 4.3

julia> # these will give you StaticArrays
       original_array + transformed_array
3-element StaticArrays.SArray{Tuple{3},Float64,1,3}:
 4.3
 5.3
 7.3

julia> transformed_array + original_array
3-element StaticArrays.SArray{Tuple{3},Float64,1,3}:
 4.3
 5.3
 7.3

julia> # matrix multiplication still works
       original_array' * transformed_array
23.699999999999996

julia> original_array * transformed_array'
3×3 Array{Float64,2}:
 4.2  4.95   6.45
 5.6  6.6    8.6
 8.4  9.9   12.9

julia> # same for reductions
       sum(transformed_array)
10.399999999999999

一个明显的缺点是您无法增长这些StaticArrays。但我假设你想保留原来的值,那么这不是问题。

另外,如上所示,操作它们时要小心,因为可能会返回StaticArrays。然后,您需要将结果显式转换为数组。