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

use*_*346 7 arrays initialization constants julia

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

z = Array(Float64, 1)
Run Code Online (Sandbox Code Playgroud)

它似乎是一个随机值.有时它是0.0,但大多数情况下它是3.78692e-316.

这种行为是有意的吗?

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

Mr *_*pha 9

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

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

b = fill(2.0, 10)
Run Code Online (Sandbox Code Playgroud)

这给你:

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
Run Code Online (Sandbox Code Playgroud)

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

b = fill(2.0, 1, 10)
Run Code Online (Sandbox Code Playgroud)

哪个给你

1x10 Array{Float64,2}:
 2.0  2.0  2.0  2.0  2.0  2.0  2.0  2.0  2.0  2.0
Run Code Online (Sandbox Code Playgroud)

  • 对于具有这些值的初始化数组,还有 `zeros` 和 `ones`。 (3认同)

waT*_*eim 2

数组分配

当元素类型取消装箱时,数组分配似乎不会初始化(见下文)。这发生在系统中非常低的级别,并且当 Julia嵌入到另一个程序中时,它是 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)]);
}
Run Code Online (Sandbox Code Playgroud)

函数alloc_big本质上是对malloc的调用,它不会初始化它分配的内存,而pool_alloc是一个从 Julia 管理的空闲列表集中获取内存的函数,同样也不会初始化。这是有道理的,因为这里可能会浪费时间,因为程序通常会转身并将其初始化为特定于程序的东西。

但是,数组有一个例外,函数_new_array_包含

if (!isunboxed)
   memset(data, 0, tot);
Run Code Online (Sandbox Code Playgroud)

该变量的值由该函数确定。要以未装箱的方式存储在数组中,元素必须是叶、不可变、不包含指针的类型。

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);
}
Run Code Online (Sandbox Code Playgroud)

原始类型BoolInt64Float64等被分类为不可变以及叶(非抽象),当然还有非指针,因此将被未装箱存储,因此不会被初始化。

julia> Float64.mutable
false
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

常数向量初始化

可能你想要这样的东西:

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
Run Code Online (Sandbox Code Playgroud)