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]?
@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)
当元素类型取消装箱时,数组分配似乎不会初始化(见下文)。这发生在系统中非常低的级别,并且当 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)
原始类型Bool、Int64、Float64等被分类为不可变以及叶(非抽象),当然还有非指针,因此将被未装箱存储,因此不会被初始化。
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)