我现在开始使用 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
。这意味着B
只能包含 type 的值Float64
。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()
这是执行您在此处尝试执行的特定操作的最佳方式。