Julia在尝试修改数组{Float 64}的最后一个数字时出错



我现在开始使用Julia,我需要插入布朗运动。我运行了下面的代码,但是出现了下面的错误:

N = 3
B = zeros(N)
B[N] = randn(1)

把:

MethodError: Cannot `convert` an object of type Vector{Float64} to an object of type Float64

B的元素类型为Float64这意味着BFloat64只能包含的值类型。rand(1)返回一个长度为1,类型为Vector{Float64}的向量,因此不能存储在B中。

julia> N = 3;
julia> B = zeros(N);
julia> eltype(B)
Float64
julia> x = randn(1);
julia> typeof(x)
Vector{Float64}

也许你想生成一个单独的Float64并放在B?然后您可以简单地使用randn(),它返回一个Float64:

julia> x = randn();
julia> typeof(x)
Float64
julia> B[N] = x
-0.2771343068955318
julia> B
3-element Vector{Float64}:
0.0
0.0
-0.2771343068955318

当您被某些东西难住时,评估Julia REPL中的单个部分以查看它们的功能通常会很有帮助。在本例中,如果单独计算randn(1),您将看到如下内容:

julia> randn(1)
1-element Vector{Float64}:
1.1308545762168796

返回一个包含随机浮点值的单元素向量。现在,当你做

B[2^N] = randn(1)

试图将一个向量赋值为浮点数数组中的最后一个值。这可能适用于一些语言,比如R和Matlab,那里没有实际的标量,而标量是由单元素数组近似的(这有很多问题,我不会在这里深入讨论),但在Julia中,标量和包含标量的数组是不同的东西。这就是为什么你会得到这个错误。

那么如何修复这个错误呢?有很多方法。您可以在赋值之前提取右侧的值,如下所示:

B[2^N] = randn(1)[1]

可以工作,但它不必要地构造一个单元素向量,只是为了立即丢弃向量并从中取出元素,这是缓慢和浪费的(这里可能无关紧要,但如果这是在一些性能敏感的代码中,您不会希望这样做)。相反,您可以通过调用不带维度参数的randn()只生成一个不在数组中的标量值:

julia> randn()
1.2990863797503651

这个值可以这样赋给B:

B[2^N] = randn()

这是完成你想要做的事情的最好方法。

最新更新