当我在Julia中定义一个数组时:
z = Array(Float64, 1)
它会显示一个随机值。有时它是0.0,但大多数情况下它是3.78692e-316。
这种行为是否打算?
如何初始化"常数"带有10个值的向量,例如b = [2.0 2 2 2]
?
答案 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)
可能你想要这样的东西:
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