1. Bắt đầu với Julia
Với giả định mình đã quen thuộc với các concepts của một ngôn ngữ lập trình như: Biến (Variables), Các kiểu dữ liệu (như Arrays và Vectors), Vòng lặp (Loops), Điều hướng (Conditionals - if/else), mình sẽ thử thực hành một vài ví dụ nhỏ với Julia với mục đích tìm hiểu các cú pháp và cấu trúc dữ liệu cơ bản.
Code không hẳn đã được tối ưu, nhưng sẽ dần được tối ưu theo các ví dụ về sau!
1.1. Các ví dụ mở đầu
1.1.1. Vẽ một quá trình sinh nhiễu trắng (White Noise Process)
Quản lý Packages: Có hai cách để quản lý Packages và Versions (Phương pháp thứ 2 được recommend khi Julia cung cấp sẵn một phương pháp SOTA cho quản lý môi trường có khả năng tái tạo lại cao):
addpakages một cách trực tiếp (ví dụPkg.add("MyPackage")hoặc] add MyPackage):
Phải cài đặt
IJuliatrên toàn cục để sử dụng trong mọi dự án;]là phím tắt để truy cập vào quản lý pakages.
- Dùng các file
Project.tomlvàManifest.toml:
Nếu dùng notebook, các file này sẽ được tự đông xác định, nhưng cài đặt sẽ không tự động, cần
] instantiate;Tệp Project có thể nằm ở folder mẹ của Notebook và Sourcecode.
Sử dụng các hàm: Có những function có sẵn trong Julia base, như randn()
Một số hàm cần gọi các thư viện ngoài Base, ví dụ plot() của thư viện Plots:
Note: thay vì ep chúng ta có thể dùng các ký tự khoa học như epsilon bằng cách \epsilon<TAB> .
Mảng: ep trong ví dụ trên chính là một mảng (array).
Trích xuất 5 thành tố đầu tiên của mảng
Để tìm kiếm trợ giúp và ví dụ cho một hàm, dùng ?:
# help?> typeof
# search: typeof typejoin TypeError
# typeof(x)
# Get the concrete type of x.
# See also eltype.
# Examples
# ≡≡≡≡≡≡≡≡≡≡
# julia> a = 1//2;
# julia> typeof(a)
# Rational{Int64}
# julia> M = [1 2; 3.5 4];
# julia> typeof(M)
# Matrix{Float64} (alias for Array{Float64, 2})Vòng lặp: hãy thử viết lại quy trình tạo random trên bằng for loops.
# poor style
n = 100
ep = zeros(n) # create an array with 0.0 as initial value
for i in 1:n # the index is looped for all 1:n, but none vector of those indices is created.
ep[i] = randn()
end # indicates the end of a loopThe word in from the for loop can be replaced by either ∈ or =.
Code trên thành công tạo ra các giá trị cho mảng ep, tuy nhiên mối quan hệ giữa i và ep được thể hiện không tường minh. Để cải thiện, hãy dùng eachindex:
Vòng lặp rất có hiệu quả về mặt bộ nhớ tuy nhiên lợi ích chính của nó là (1) thể hiện mã một cách rõ ràng hơn, ít mắc lỗi chính tả hơn, và (2) cho phép trình biên dịch linh hoạt tạo mã nhanh một cách sáng tạo.
Trong Julia, chúng ta cũng có thể loop một array trực tiệp, như ví dụ dưới đây:
ep_sum = 0.0 # need to use 0.0 rather than 0
m = 5
for ep_eval in ep[1:m]
ep_sum = ep_sum + ep_eval
end
ep_mean = ep_sum / mvới ep[1:m] trả về các giá trị của vector 1 đến m.
Julia cũng có các operator/function có sẵn để kiểm tra các kết quả này.
Gõ \approx<TAB> .
≈ và isapprox dùng để kiểm tra đẳng thức (equality), khác với giá trị (==), sử dụng cho số và các loại khác.
Định nghĩa hàm: để thực hành, tiếp tục sử dụng for để viết một hàm biểu diễn lại quá trình trên, nhưng thú vị hơn thì thử bình phương thay vì các trị số random đơn thuần xem sao.
# poor style
function generatedata(n)
ep = zeros(n)
for i in eachindex(ep)
ep[i] = (randn())^2 # squaring the result
end
return ep
end
data = generatedata(10)
plot(data)Hãy nhớ rằng randn() có thể trả về một vector, thử cải thiện xem.