줄리아의 브로드캐스팅 문법

줄리아의 브로드캐스팅 문법

Syntax for Broadcasting in julia

개요

브로드캐스팅Broadcasting줄리아에서 가장 중요한 개념으로, 벡터화된 코드를 작성함에 있어서 아주 편리한 문법이다.1 이항연산 앞에 .을 찍거나 함수 뒤에 .을 찍는 식으로 사용한다. 이는 점별Pointwise하게 함수를 적용시킨다는 의미에서 찰떡같은 표현이다.

프로그래밍적으로 브로드캐스팅은 맵과 리듀스에서 맵Map을 쓰기 쉽게 만들어놓은 것으로 볼 수 있다.

코드

이항 연산

이항연산은 앞에 .을 찍어서 사용한다. 가령 행렬 $A \in \mathbb{Z}_{9}^{3 \times 4}$ 의 모든 원소에 스칼라 $a \in \mathbb{R}$ 을 더하는 코드는 다음과 같다.

julia> A = rand(0:9, 3,4)
3×4 Matrix{Int64}:
 5  6  3  3
 7  4  8  8
 0  2  2  7

julia> a = rand()
0.23234165065465284

julia> A .+ a
3×4 Matrix{Float64}:
 5.23234   6.23234  3.23234  3.23234
 7.23234   4.23234  8.23234  8.23234
 0.232342  2.23234  2.23234  7.23234

일반 함수

julia> f(x) = x^2 - 1
f (generic function with 3 methods)

julia> f(a)
-0.9460173573710713

가령 위와 같은 함수 $f : \mathbb{R} \to \mathbb{R}$ 을 생각해보자. 이는 스칼라 함수이므로 $a \in \mathbb{R}$ 에 대해 위와 같이 잘 계산된다.

julia> f(A)
ERROR: LoadError: DimensionMismatch

그러나 행렬 $A$ 를 집어넣어보면 LoadError가 발생한다. 생각해보면 행렬의 제곱, 특히 $A \in \mathbb{Z}_{9}^{3 \times 4}$ 와 같은 직사각 행렬의 제곱이라는 것이 무엇인지부터가 애매모호하기 때문에 $f(x) = x^{2} - 1$ 와 같은 함수에 무작정 넣을 수 없는 것이다. 그러나 우리가 원하는 결과가 행렬 $A$ 의 모든 값 각각에 제곱을 취한 뒤 $1$ 을 빼서 얻는 행렬이라면, f.와 같이 점을 찍음으로써 행렬의 모든 원소에 함수 $f : \mathbb{R} \to \mathbb{R}$ 를 취할 수 있다.

julia> f.(A)
3×4 Matrix{Int64}:
 24  35   8   8
 48  15  63  63
 -1   3   3  48

환경

  • OS: Windows
  • julia: v1.7.0

  1. https://docs.julialang.org/en/v1/manual/arrays/#Broadcasting ↩︎

댓글