3

我现在开始使用 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
4

2 回答 2

3

的元素类型BFloat64。这意味着B只能包含 type 的值Float64rand(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
于 2021-10-12T13:45:46.353 回答
2

当您对评估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()

这是执行您在此处尝试执行的特定操作的最佳方式。

于 2021-10-12T15:30:13.567 回答