Julia 中用于 "marking" 目的的用户定义类型
User defined type in Julia for "marking" purposes
在我的代码中,我需要跟踪两种数据项,即原始数据项和转换后的数据项。
我将原始数据项和转换后的数据项都存储为 Array{Float64,1}
。
但是,我需要跟踪数据项是否经过转换,因为我的代码中的某些函数使用原始数据项,而另一些函数使用转换后的数据项。
为了确保正确性并避免将转换后的数据项传递给应该与原始数据项一起使用的函数,我想我可以创建一个名为 Transformed
的类型。此类型可用于函数声明中,从而确保正确性。
当然我查看了文档,但这对我的帮助还不够。
我想我需要做的是:
primitive type Transformed :< Array{Float64,1} end
但这当然行不通(它甚至不是原始的!)
我必须去结构吗?有什么建议么?干杯。
是的,您可能想要 struct
或包含 Array{Float64, 1}
的 mutable struct
。您可以在 Julia 手册中有关复合类型(即结构)的部分了解更多信息:https://docs.julialang.org/en/stable/manual/types/#Composite-Types-1
一个简单的例子是:
struct Transformed
data::Array{Float64, 1}
end
如果您不想使用 .data
字段访问数组,您可以考虑使用 StaticArrays
。可能还有其他一些已经存在的数据结构,但这是我首先想到的。
您可以使用 SVector
或 with some macros 声明这些。这样做的好处是你可以很容易地检查一个数组是 StaticArray 还是常规数组,但你可以将它们用作常规数组。
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
一个明显的缺点是您无法增长这些 StaticArray。但我假设如果您想保留原始值,那么这无论如何都不是问题。
此外,如上所示,在对它们进行操作时要小心,因为您可能会返回 StaticArrays。然后,您需要将结果显式转换为数组。
在我的代码中,我需要跟踪两种数据项,即原始数据项和转换后的数据项。
我将原始数据项和转换后的数据项都存储为 Array{Float64,1}
。
但是,我需要跟踪数据项是否经过转换,因为我的代码中的某些函数使用原始数据项,而另一些函数使用转换后的数据项。
为了确保正确性并避免将转换后的数据项传递给应该与原始数据项一起使用的函数,我想我可以创建一个名为 Transformed
的类型。此类型可用于函数声明中,从而确保正确性。
当然我查看了文档,但这对我的帮助还不够。 我想我需要做的是:
primitive type Transformed :< Array{Float64,1} end
但这当然行不通(它甚至不是原始的!)
我必须去结构吗?有什么建议么?干杯。
是的,您可能想要 struct
或包含 Array{Float64, 1}
的 mutable struct
。您可以在 Julia 手册中有关复合类型(即结构)的部分了解更多信息:https://docs.julialang.org/en/stable/manual/types/#Composite-Types-1
一个简单的例子是:
struct Transformed
data::Array{Float64, 1}
end
如果您不想使用 .data
字段访问数组,您可以考虑使用 StaticArrays
。可能还有其他一些已经存在的数据结构,但这是我首先想到的。
您可以使用 SVector
或 with some macros 声明这些。这样做的好处是你可以很容易地检查一个数组是 StaticArray 还是常规数组,但你可以将它们用作常规数组。
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
一个明显的缺点是您无法增长这些 StaticArray。但我假设如果您想保留原始值,那么这无论如何都不是问题。
此外,如上所示,在对它们进行操作时要小心,因为您可能会返回 StaticArrays。然后,您需要将结果显式转换为数组。