首页 > 解决方案 > 如何在 Julia 中重新计算向量的 eltype

问题描述

假设我有一个向量 v = Any[1,2,3,4]

我想以这样的方式重新计算它的 eltype typeof(v) = Vector{Int}

是否可以在不必手动连接每个元素的情况下完成此操作v

标签: julia

解决方案


您不能“重新输入”现有的,只需使用更具体的类型1v创建它的副本。

转换

假设您已经(静态地)知道结果类型,您有多种选择。最易读(和 IMO,惯用)将是

Vector{Int}(v)

这几乎相当于

convert(Vector{Int}, v)

除了如果输入类型已经是目标类型,后者不会复制。或者:

convert.(Int, v)

这肯定也会复制。

转换成什么

如果您知道“常见类型”是什么,那么有多种选择如何获得匹配的一种。一般来说,typejoin可用于查找最小上界:

mapreduce(typeof, typejoin, v; init=Union{})

结果很可能是抽象的,例如对于s 和sReal的数组。因此,对于数字类型,您可能会更好:IntFloat64promote_type

mapreduce(typeof, promote_type, v; init=Union{})  # or init=Number

这至少为您Float64提供了混合Ints 和Float64s。

但并不是真的推荐所有这些,因为它可能很脆弱,令人惊讶,而且肯定不是类型稳定的。


1对于具有兼容二进制形式的某些类型组合,reinterpret将起作用并返回具有不同类型的视图,但这仅适用于位类型,而事实Any并非如此。因为这两个数组在内存中具有不同的布局,所以转换Any[1,2,3]Int[1,2,3]复制基本上是必要的:前者是指向单独分配的整数对象的指针数组,而后者将Int值内联存储在连续内存中。


推荐阅读