Аккуратный способ определить произвольный порядок Тензор в Юлии - PullRequest
0 голосов
/ 21 октября 2018

Я хочу определить произвольный порядок тензорного типа в Юлии.Здесь Tensor-like означает что-то вроде Vector{Vector{Vector{T}}.Моим испытанием был код ниже:

function Tensor(N::Int, T::DataType)
    N==0 && return eval(T)
    return Tensor(N-1, eval(Expr(:curly, :Vector, T)))
end

И декларация будет data = Tensor(3, Float64)[].По этому поводу у меня два вопроса.1) Есть ли более аккуратный способ сделать это?2) Я предпочитаю декларацию, используя скобки типа data = Tensor{3, Float64}[], а не круглые скобки.Как я могу сделать это, возможно, с помощью метапрограммирования?

1 Ответ

0 голосов
/ 22 октября 2018

Предполагая, что вы знаете размер тензора.Пусть

d = (4,3,2) 

будет размером вашего тензора.Вы можете создать его двумя способами:

  1. Массивы нулей

Использовать zeros() - см. Пример ниже:

julia> zeros(Float64,d)
4×3×2 Array{Float64,3}:
[:, :, 1] =
 0.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0

[:, :, 2] =
 0.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0
Не инициализировано (быстрее, обратите внимание на значения мусора)

Использовать конструктор типа Array:

julia> x = Array{Float64,length(d)}(undef,d) 
4×3×2 Array{Float64,3}:                      
[:, :, 1] =                                  
 5.34466e-316  5.34466e-316  5.34467e-316    
 5.34466e-316  5.34467e-316  5.34467e-316    
 5.34466e-316  5.34467e-316  5.34467e-316    
 5.34466e-316  1.51858e-316  5.34468e-316    

[:, :, 2] =                                  
 1.51858e-316  5.34487e-316  0.0             
 1.51858e-316  5.34487e-316  0.0             
 1.51858e-316  5.34429e-316  0.0             
 1.51858e-316  5.16938e-316  0.0             
...