朱莉和朱莉娅套装

如果您喜欢这篇文章,可以在我自己的博客上阅读此文章。

如果我被迫下注,在接下来的五年中,哪种编程语言将彻底改变科学软件,那么我会把钱花在Julia身上

后超C ++和Rust的系统编程革命将带给系统工程,Julia将带给科学计算。

朱莉娅是什么,为什么你要关心它?

尽管看起来与Python非常相似,但从最终用户的角度来看,Julia还是有一些技巧。

一旦Julia代码开始执行,它就是该程序的任何编写良好的C,C ++或Fortran实现的匹配项。

Julia使并行操作变得容易,并允许您编写漂亮而简洁的代码,并且运行速度很快。 您可以在其官方网站上了解更多有关Julia的快速便捷集成和部署的信息

Julia仍然是一种动态类型化的语言,这意味着可以键入值,但是没有变量。 但是,它为创建值时的值类型提供了一种非常简单的语法。 与Python不同,它的类型系统非常先进,这意味着您可以执行以下操作:

arr = Array{Float16,1}()
push!(arr, 12.9) # Works
push!(arr, "my string") # Give a type error
val = UInt8(11)
push!(arr, val) # `val` is cast to Float16 then appended

它还为诸如多维数组和使用SIMD优化的数组操作之类的内容提供本机支持。 此外,其数组是实际数组,而不是列表,而是连续分配的大块内存,用于快速迭代和查找。

所有这些,意味着Julia可以实现惊人的矢量计算速度,而无需第三方容器或线性代数库。

生成Julia集

既然它是如此低落的果实,我不妨通过生成和绘制一些Julia集来向您展示Julia

对于本博客的其余部分,我将尝试向您展示一些Julia代码,以展示其某些功能。 希望我会让您相信它的效率。

要进行后续操作,您需要安装Julia并在您选择的文本编辑器中打开.jl文件。 您可以使用julia my_file.jl运行代码。

我喜欢Julia的一件事是,它消除了编写快速过程代码的大部分麻烦。 例如,这些函数会生成我们的Julia集矩阵。

function julia(x, y, width, height, c)
# Scale size the fractal within our frame
z = ((y/width)*2.7 - 1.3) + ((x/height)*4.5 - 2.5)im
for i = 1:255
z = z^2 + c
if abs(z) >= 4
return i
end
end
return -255
end


function julia_set(height, width, c)
[julia(x, y, width, height, c) for x = 1:height, y = 1:width]
end

我们可以使用给定的图像大小和c参数调用julia_set ,然后绘制所得矩阵的热图以查看分形。

绘制热图

关于Julia的另一个好处是,它由社区维护。 可以在Julia代码中混合使用C和Python库的简便且实际上不存在的开销,使我们能够使用许多成熟的库,这些库中不存在或不需要原生的Julia替代方案。

绘图功能非常强大,但它远未达到理想的记录库。 它提供了一个Juila接口,在该接口下,不同的后端(例如pyplot或plotyjs)将生成我们的图像。 我将使用GR后端。

# Install the packages we need
Pkg.add("Plots")
Pkg.add("GR")
# Import the Plots library in the current runtime
using Plots
# Initialize the gr backend
gr()

好了,现在剩下的唯一事情就是选择我们的c项,生成茱莉亚集合并绘制它。

# Set the size of our images
height = 800
width = 800
c = 1.2e^(1.1π*im)
# Generate the set
data = julia_set(height, width, c)
# Generate the heatmap and save it as a PNG
file_name = "/tmp/julia_$(height)_$(width)_$(c.re)_$(c.im)"
png(heatmap(data, size=(width,height), color=:ice), file_name)

这足以使我们产生相当大的分形,但是,我认为我们应该走得更远。

动画分形

我们可以使用Plots程序包做的另一件事是创建动画,只需通过ffmpeg将多个png背靠背放置即可。

这将使用@animate宏从我们的for循环中创建动画来完成。 然后, gif函数将其保存到文件中并提供所需的帧速率。

现在,根据您选择的c值,帧速率,配色方案和分辨率,您可以在此处获得截然不同的动画。 我创建了一个我很满意的游戏。

使其平行

生成图像并计算集合可能需要很长时间。 但是,Julia提供了可以轻松并行化循环而没有副作用的工具。 对于使用@parallel宏生成集合的循环,可以这样做。

这里要注意的一件事是,您需要使用-p参数运行Julia以从中受益。 例如julia -p 10 ,使用9个附加进程。

完成此操作后,需要使用@everywhere宏声明函数,以便可以从所有进程访问它们。

@everywhere julia = julia
@everywhere julia_set = julia_set

# Re-write our code to generate the sets in parallel
nr_frames = 40

sets = @sync @parallel append! for n=0:nr_frames
c = e ^ (2*π*n/nr_frames*im)
set = julia_set(height, width, c)
[set]
end

anim = @animate for set in sets
heatmap(set, size=(width,height), color=:speed, leg=false)
end
file_name = "/tmp/julia_$(height)_$(width)_$(nr_frames).gif"
gif(anim, file_name, fps=4)

并行化动画看似微不足道,但是由于@animate工作方式,它实际上要复杂一些。 我会将其作为练习留给读者。

我鼓励任何有兴趣尝试将这种语言用于其某些科学计算需求的人。

在很短的时间内,我开始偏爱Julia而不是Python,并且我确信我的一些读者可能会感到相同

注意:如果您喜欢这篇文章,那么我会有一篇关于学习Julia的后续文章(该文章涉及*炒作*机器学习): 对抗性生成的Julia集

From: https://hackernoon.com/julia-and-julia-sets-e5a6fa3de7a7

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值