julia - 如何在 Julia 中重新计算向量的 eltype
问题描述
假设我有一个向量
v = Any[1,2,3,4]
我想以这样的方式重新计算它的 eltype
typeof(v) = Vector{Int}
是否可以在不必手动连接每个元素的情况下完成此操作v
?
解决方案
您不能“重新输入”现有的,只需使用更具体的类型1v
创建它的副本。
转换
假设您已经(静态地)知道结果类型,您有多种选择。最易读(和 IMO,惯用)将是
Vector{Int}(v)
这几乎相当于
convert(Vector{Int}, v)
除了如果输入类型已经是目标类型,后者不会复制。或者:
convert.(Int, v)
这肯定也会复制。
转换成什么
如果您不知道“常见类型”是什么,那么有多种选择如何获得匹配的一种。一般来说,typejoin可用于查找最小上界:
mapreduce(typeof, typejoin, v; init=Union{})
结果很可能是抽象的,例如对于s 和sReal
的数组。因此,对于数字类型,您可能会更好:Int
Float64
promote_type
mapreduce(typeof, promote_type, v; init=Union{}) # or init=Number
这至少为您Float64
提供了混合Int
s 和Float64
s。
但并不是真的推荐所有这些,因为它可能很脆弱,令人惊讶,而且肯定不是类型稳定的。
1对于具有兼容二进制形式的某些类型组合,reinterpret
将起作用并返回具有不同类型的视图,但这仅适用于位类型,而事实Any
并非如此。因为这两个数组在内存中具有不同的布局,所以转换Any[1,2,3]
为Int[1,2,3]
复制基本上是必要的:前者是指向单独分配的整数对象的指针数组,而后者将Int
值内联存储在连续内存中。