Julia Initialized Array / Vector不是零而是随机的

时间:2014-05-28 06:08:14

标签: arrays initialization constants julia

当我在Julia中定义一个数组时:

z = Array(Float64, 1)

它会显示一个随机值。有时它是0.0,但大多数情况下它是3.78692e-316。

这种行为是否打算?

如何初始化"常数"带有10个值的向量,例如b = [2.0 2 2 2]

3 个答案:

答案 0 :(得分:8)

@waTeim是正确的,在分配数组时,它不会初始化为0或任何特定值。

在Julia中分配和初始化具有特定值的新数组的方法是fill(),因此对于b,您可以这样做:

b = fill(2.0, 10)

这会给你:

10-element Array{Float64,1}:
 2.0
 2.0
 2.0
 2.0
 2.0
 2.0
 2.0
 2.0
 2.0
 2.0

或者如果你想要一个行向量:

b = fill(2.0, 1, 10)

哪个给你

1x10 Array{Float64,2}:
 2.0  2.0  2.0  2.0  2.0  2.0  2.0  2.0  2.0  2.0

答案 1 :(得分:2)

数组分配

当元素类型为unboxed时,似乎没有初始化数组分配(见下文)。这种情况发生在系统中非常低的水平,顺便说一下,当Julia在另一个程序中embedded时,它就是API的一部分。在Julia对象分配的源代码中,最低级别由函数allocobj执行。

DLLEXPORT void *allocobj(size_t sz)
{
#ifdef MEMDEBUG
    return alloc_big(sz);
#endif
    if (sz > 2048)
        return alloc_big(sz);
    return pool_alloc(&pools[szclass(sz)]);
}

函数 alloc_big 本质上是对 malloc 的调用,它不会初始化它分配的内存,而 pool_alloc 是一个获取内存的函数来自Julia管理的一组免费列表,同样也没有初始化。这是有道理的,因为这可能会浪费时间,因为程序通常会转向并将其初始化为程序特定的程序。

但是,在数组的情况下有一个例外,函数_new_array_包含

if (!isunboxed)
   memset(data, 0, tot);

此变量的值由this function确定。要在数组中保存未装箱,元素必须是包含叶子,不可变,不包含指针的类型。

static inline int store_unboxed(jl_value_t *el_type)
{
    return jl_is_datatype(el_type) && jl_is_leaf_type(el_type) && jl_is_immutable(el_type) && jl_is_pointerfree((jl_datatype_t*)el_type);
}

原始类型 Bool Int64 Float64 < / strong>等被分类为不可变的以及叶子(非抽象),当然还有非指针,因此将被存储为未装箱的,因此不会被初始化。

julia> Float64.mutable
false

此外,不可变复合类型似乎也会触发此行为。

julia> immutable type Foo bar::Int end

julia> z=Array(Foo,1)
1-element Array{Foo,1}:
 Foo(0)

julia> z=Array(Foo,1)
1-element Array{Foo,1}:
 Foo(-4)

julia> z=Array(Foo,1)
1-element Array{Foo,1}:
 Foo(4432839632)

Const矢量初始化

可能你想要这样的东西:

julia> const C = [2, 2, 2, 2.0, 2, 2, 2, 2, 2, 2]
10-element Array{Float64,1}:
 2.0
 2.0
 ...
 2.0

julia> D = [ 1 ];

julia> C = D;
ERROR: invalid redefinition of constant C

答案 2 :(得分:0)

一个简单的方法如下:

julia> zeros(3) 
3-element Vector{Float64}:
 0.0
 0.0
 0.0

或对于那些:

julia> ones(3)
3-element Vector{Float64}:
 1.0
 1.0
 1.0

或某些特定值:

julia> ones(3)*2
3-element Vector{Float64}:
 2.0
 2.0
 2.0