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 پایتون

ویژگیJuliaNumPy
برداری‌سازیداخلی زبان (.)کتابخانه جدا
حلقه 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))

این مبحث بخشی از دوره آموزش کامل جولیا است.

ابزارهای مرتبط