天天看點

朱莉和朱莉娅套裝

朱莉和朱莉娅套裝

如果您喜歡這篇文章,可以在我自己的部落格上閱讀此文章。

如果我被迫下注,在接下來的五年中,哪種程式設計語言将徹底改變科學軟體,那麼我會把錢花在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

上一篇: 擷取cookie
下一篇: 汽車制造商