Broadcast و Vectorization در جولیا
عملگر نقطه (.)، broadcast روی هر تابعی و چرا در جولیا حلقه سریع است
Broadcast — قدرت پنهان جولیا
با اضافه کردن نقطه به هر عملگر یا تابع، آن را روی کل کالکشن اعمال میکنید:
arr = [1, 2, 3, 4]
# عملگرهای برداری
println(arr .+ 10) # [11, 12, 13, 14]
println(arr .* 2) # [2, 4, 6, 8]
println(arr .^ 2) # [1, 4, 9, 16]
println(arr .> 2) # [false, false, true, true]
هر تابعی را برداری کنید!
# توابع داخلی
arr = [4.0, 9.0, 16.0]
println(sqrt.(arr)) # [2.0, 3.0, 4.0]
println(round.(arr)) # گرد کردن همه
# توابع خودتان!
function myFunc(x)
return x^2 + 1
end
nums = [1, 2, 3]
println(myFunc.(nums)) # [2, 5, 10] — جادو!
این «broadcasting» است — نقطه را به هر تابعی بچسبانید و روی آرایه کار میکند! نیازی به map نیست (البته map هم هست).
ترکیب عملگرها با @.
arr = [1.0, 2.0, 3.0]
# بدون @. — پر از نقطه!
result = 2 .* arr .+ 1 ./ (arr .^ 2)
# با @. — تمیز!
result2 = @. 2arr + 1 / arr^2
println(result == result2) # true
Broadcast با چند آرایه
a = [1, 2, 3]
b = [10, 20, 30]
println(a .+ b) # [11, 22, 33]
println(a .* b) # [10, 40, 90]
# با اسکالر
println(a .+ 100) # [101, 102, 103]
چرا broadcast سریع است؟
جولیا broadcast را به حلقه بهینهشده کامپایل میکند — هم سریع و هم خوانا:
-- این سه همارزشاند:
result = arr .^ 2
result = map(x -> x^2, arr)
result = [x^2 for x in arr] -- comprehension
تفاوت با NumPy پایتون
| ویژگی | Julia | NumPy |
|---|---|---|
| برداریسازی | داخلی زبان (.) | کتابخانه جدا |
| حلقه for | 🚀 سریع! | 🐢 کند |
| توابع سفارشی | مستقیم f.(arr) | نیاز به vectorize |
در پایتون مجبورید همه چیز را vectorize کنید چون حلقه کند است. در جولیا حلقه هم سریع است — broadcast فقط برای خوانایی!
مثال عملی: پردازش داده
temps = [15.5, 22.0, 28.3, 35.1, 18.7]
# تبدیل به فارنهایت
fahrenheits = @. temps * 9/5 + 32
println(fahrenheits)
# دستهبندی
categories = ifelse.(temps .> 25, "گرم", "معتدل")
println(categories)
# آمار
println("میانگین: ", sum(temps) / length(temps))
این مبحث بخشی از دوره آموزش کامل جولیا است.