2017-01-25 4 views
3

Как я мог проверить тип элемента вложенного массива assumming я не знаю, уровень вложенности ?:джулия-Ланг Проверьте тип элемента произвольно вложенного массива

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? 
+1

вы можете использовать 'typeof (a) .depth' для получения уровня вложенности. – Gnimuc

+0

Спасибо. Это очень полезный атрибут. – Phuoc

ответ

3

Существует, вероятно, умный способ сделать это с одной линии, но в то же время, вы можете использовать рекурсивные вызовы eltype сделать это внутри while цикла:

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

Заметим, что это работает для вложенных массивов любой размерности, т.е. не только должен быть Vector, как exa mple в вашем вопросе ...

+0

Спасибо! Он работает отлично. Я также нашел однострочное выражение с использованием regex :) '' 'match (r" [\ w \ d] + ", match (r" {[^ {}] +} ", string (typeof (a))) .match |> parse |> eval''' – Phuoc

+0

@Phuoc Подход регулярного выражения, безусловно, работает (если разработчики не изменяют поведение 'string' для отображения типов), но посмотрите на @ tim тоже - он использует ту же идею, что и мое решение, но, вероятно, является более «юлианским» способом выражения кода. Приветствия. –

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 
6

Как это часто бывает для вычислений типа, рекурсивный подход работает очень хорошо:

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*) 
} 
Смежные вопросы