在Julia中定义任意阶张量的简洁方法

时间:2018-10-21 13:44:00

标签: julia metaprogramming

我想在Julia中定义一个任意阶张量式类型。在这里,类似Tensor的含义类似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 :(得分:0)

假设您知道张量的大小。 让

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
  1. 未初始化(更快,请注意垃圾值)

使用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