【问题标题】:Neat way to define arbitraly order Tensor in Julia在 Julia 中定义任意阶张量的巧妙方法
【发布时间】:2018-10-21 13:44:00
【问题描述】:

我想在 Julia 中定义一个任意阶的类张量类型。在这里,类似张量的意思是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}[] 这样的大括号来声明,而不是使用括号。我怎样才能通过元编程来做到这一点?

【问题讨论】:

  • 在您的用例中,您不想只说 data = Array{Float64, 3} 吗?
  • 哦,这正是我想要的......(我是新手)
  • 你不应该使用eval,尤其是这样的事情。

标签: julia metaprogramming


【解决方案1】:

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

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             

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 1970-01-01
    • 2018-12-31
    • 2016-04-19
    • 1970-01-01
    • 2011-03-20
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多