julia-lang检查任意嵌套数组的元素类型

时间:2017-01-25 05:19:19

标签: julia

我如何检查嵌套数组的元素类型,因为我不知道嵌套的级别?:

td {
    border: 1px black solid;
    padding: 5px;
}
.rotate {
  text-align: center;
  white-space: nowrap;
  vertical-align: middle;
  width: 1.5em;
}
.rotate div {
     -moz-transform: rotate(-90.0deg);  /* FF3.5+ */
       -o-transform: rotate(-90.0deg);  /* Opera 10.5 */
  -webkit-transform: rotate(-90.0deg);  /* Saf3.1+, Chrome */
             filter:  progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083);  /* IE6,IE7 */
         -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083)"; /* IE8 */
         margin-left: -10em;
         margin-right: -10em;
}

3 个答案:

答案 0 :(得分:7)

由于类型计算经常出现这种情况,因此递归方法非常有效:

nested_eltype(x) = nested_eltype(typeof(x))
nested_eltype{T<:AbstractArray}(::Type{T}) = nested_eltype(eltype(T))
nested_eltype{T}(::Type{T}) = T

这没有运行时开销:

julia> @code_llvm nested_eltype([[[[[[[[[[1]]]]]]]]]])

define %jl_value_t* @julia_nested_eltype_71712(%jl_value_t*) #0 {
top:
  ret %jl_value_t* inttoptr (i64 140658266768816 to %jl_value_t*)
}

答案 1 :(得分:3)

使用一行可能有一种聪明的方法可以做到这一点,但与此同时,您可以使用eltype的递归调用在while循环中执行此操作:

function nested_eltype(x::AbstractArray)
    y = eltype(x)
    while y <: AbstractArray
        y = eltype(y)
    end
    return(y)
end

请注意,这适用于任何维度的嵌套数组,即它不一定必须像您问题中的示例一样Vector ...

答案 2 :(得分:1)

这是使用.depth属性的生成版本:

@generated function etype{T}(x::T)
  ex = :(x)  
  for i = 1:T.depth
    ex = :($ex |> eltype)
  end
  ex
end

julia> a = [[[[1]]]]
1-element Array{Array{Array{Array{Int64,1},1},1},1}:
 Array{Array{Int64,1},1}[Array{Int64,1}[[1]]]

julia> etype(a)
Int64