如何将此 Octave 代码转换为 Julia?

问题描述

我想在 Julia 中制作后勤地图,但遇到了困难。我已经知道如何在 Octave 中做到这一点,我怎么能把这段代码转给 Julia?我的难点主要在“map [i,:]”部分。

#Creates a vector of initial conditions and "r"
x=rand(150,1);
r=(2.51:.01:4);

#Transpose the r
r=r';

#Makes 300 times the product of each element of r for each element of x
for i=1:300
x=r.*x.*(1-x);
end

#Makes 200 times the product of each element of r for each element of x and stores each value of x on line i of the "map" matrix
for i=1:200
x=r.*x.*(1-x);
map(i,:)=x;
end

#Plots each column of the map for each element o r
plot(r,map,'.')

解决方法

从这里开始:

#Creates a vector of initial conditions and "r"
x=rand(150,1);

这不是向量,而是大小为 150x1 的矩阵。如果你想要一个向量,写:

x = rand(150)

至于这个:

r=(2.51:.01:4);

#Transpose the r
r=r';

有点不清楚,但我认为您想要一个与 x 长度相同的向量,在这种情况下,您应该转置它,因为这会将它变成一个 1x150 矩阵.所以改为写

r = 2.51:0.01:4
# or,maybe better
r = range(2.51,4; length=length(x))

下一步:

#Makes 300 times the product of each element of r for each element of x
for i=1:300
x=r.*x.*(1-x);
end

不要在每次迭代时创建一个新变量 x,而是就地更新 x,并记住在此处添加所有运算符:

for i in 1:300
    x .= r .* x .* (1 .- x) # dot everything
end

我真的不明白你的代码在这里发生了什么,它似乎只是做了更多相同的事情,有点随意。更重要的是,您尝试在定义之前更新 map。此外,您不应该真正使用名称 map,因为这是 Julia 中一个重要内置函数的名称。

#Makes 200 times the product of each element of r for each element of x and stores each value of x on line i of the "map" matrix
for i=1:200
x=r.*x.*(1-x);
map(i,:)=x;
end

另类。预定义一个矩阵,将其命名为 map 以外的其他名称,并按列而不是按行存储信息,因为它在 Matlab/Octave 和 Julia 中都更有效率

M = similar(x,length(x),200)
for i in 1:200
    x .= r .* x .* (1 .- x)
    M[:,i] .= x  # use square brackets,not parens
end

顺便说一句:如果您在运算符之间放置空格,您的代码将变得更具可读性。把所有东西塞在一起会让人看起来很凌乱。此外,使用缩进以提高可读性。并删除所有分号。

,

我有一段时间没有写 julia,所以现在可能有更有效的方法来做到这一点,但这里或多或少与您的八度代码直接等效。

using PyPlot

x = rand( 150,1 );
r = reshape( 2.51:.01:4,(:,1) );

for i in 1:300
    global x
    x = r .* x .* (1 .- x);
end

Map = Matrix{Float64}(undef,200,150);

for i in 1:200
    global x,Map
    x = r .* x .* (1 .- x);
    Map[i:i,:] .= transpose(x);
end

for i in 1:length(r)
   plot( r,Map[i,:],"." )
end