+1
๋๋ func.(args...)
์ ๋ํ ๊ตฌ๋ฌธ ์คํ์ผ๋ก
broadcast(func, args...)
ํ์ง๋ง ์ ๋ง ๊ทธ๋ ๊ฒ ์ ํธํ ๊น์?
์ด๋ ์ชฝ์ด๋ , +1.
:-1: f[...]
์ ๋ํ Stefan์ ๋ค๋ฅธ ์ ์ ์ ์ดํด์ ๋งค์ฐ ์ ์ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ihnorton ์ฒ๋ผ ์ ๋ ์ด ์์ด๋์ด๋ฅผ ๋ณ๋ก ์ข์ํ์ง ์์ต๋๋ค. ํนํ a .+ b
์ sin.(a)
๊ฐ ๋ชจ๋ ์๋ ๋น๋์นญ์ด ์ซ์ต๋๋ค.
ํน๋ณํ ๊ตฌ๋ฌธ์ด ํ์ํ์ง ์์ ์๋ ์์ต๋๋ค. #1470์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
call(f::Callable,x::AbstractArray) = applicable(f,x) ? apply(f,x) : map(f,x)
์ค๋ฅธ์ชฝ? ์ด๋ค ๊ธฐ๋ฅ์์๋ ์๋ ๋งคํ์ ์ฌ์ฉํ๊ธฐ์๋ ๋๋ฌด ๋ง์ ์ ์ผ ์ ์์ต๋๋ค.
@quinnj ๊ทธ ํ ์ค์ ํธ์ถ ๊ณผ๋ถํ ํ์ฉ์ ๋ํ ๋์ ๊ฐ์ฅ ํฐ ๋๋ ค์์ ์์ฝํฉ๋๋ค. ๋๋ ๋ฉฐ์น ๋์ ์ ์ ์ ์ ์์ต๋๋ค.
๊ตฌ๋ฌธ์ ๊ฐ๋ฅํ์ง ์์ง ํ์คํ์ง ์์ง๋ง .sin(x)
๋ ์ด๋ป์ต๋๊น? a .+ b
์ ๋ ๋น์ทํฉ๋๊น?
[]
์ด(๊ฐ) ๋๋ฌด ๊ณผ๋ถํ๋์ด ์ด ์ฉ๋๋ก ์๋ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด, Int(x)
์ ์ธ ์ ์์ง๋ง Int[x]
๋ ๋ฐฐ์ด์ ๊ตฌ์ฑํ๋ฏ๋ก map
๋ฅผ ์๋ฏธํ ์ ์์ต๋๋ค.
.sin(x)
๋ก ํ์นํฉ๋๋ค.
์ด๋ฅผ ์ํด ์ผ๋ถ ๊ตฌ๋ฌธ์ ํ์ํด์ผ ํ์ง๋ง Int(x)
๊ฐ ์ค์นผ๋ผ ๋ฒ์ ์ด๋ฉด Int[x]
๋ ์ ์ถ์ ๋ฐ๋ผ Int
์์ ์ ํ์ ๋ฒกํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. ๋ด ์๊ฐ์ ๊ทธ ๊ตฌ๋ฌธ์ ๋ณด๋ค ์ผ๊ด์ฑ ์๊ฒ ๋ง๋ค ์ ์๋ ๊ธฐํ๋ ์ค์ ๋ก f[v]
์ ์์ ๊ฐ์ฅ ๋งค๋ ฅ์ ์ธ ์ธก๋ฉด ์ค ํ๋์
๋๋ค.
map
f[v]
๊ตฌ๋ฌธ์ ๋ง๋๋ ๊ฒ์ด ๊ตฌ๋ฌธ์ ๋ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น? ์ดํด๊ฐ ์ ๋ผ์. map
๋ ํ์ฌ T[...]
๋ฐฐ์ด ์์ฑ์ ๊ตฌ๋ฌธ๊ณผ "๋ชจ์"์ด ๋ค๋ฆ
๋๋ค. Vector{Int}[...]
๋ ์ด๋ป์ต๋๊น? ์๋ํ์ง ์๊ฒ ์ต๋๊น?
lol, @JeffBezanson์ ๋๋ผ๊ฒ ํด์ ์ฃ์กํฉ๋๋ค! ํํ, ํธ์ถ ์ค๋ฒ๋ก๋ฉ์ ํ์คํ ์ฝ๊ฐ ๋ฌด์ญ์ต๋๋ค. ๊ฐ๋ julia์์ ํ ์ ์๋ ์ฝ๋ ๋๋
ํ์ ์ข
๋ฅ์ ๋ํด ์๊ฐํ๊ณ call
๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฐ์ ๊ฑฐ์น ์์
์ ์ํํ ์ ์์ต๋๋ค.
.sin(x)
๋ ์ข์ ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ค ์ธ์๋ก ๋ฌด์์ ํ ๊ฒ์ธ์ง์ ๋ํ ํฉ์๊ฐ ์์์ต๋๊น?
:-1:. ๊ณ ์ฐจ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ๋ช ๊ฐ์ ๋ฌธ์๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๊ฐ๋
์ฑ ์ธก๋ฉด์์ ๋น์ฉ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. .func()
/ func.()
๋ฐ func()
๊ฐ ๋์ฒ์ ์ฐ์ฌ๋ ํ์ผ์ ์์ํ ์ ์์ต๋๊น?
์ด์จ๋ ์ ์ด๋ a.(b)
๊ตฌ๋ฌธ์ ์ ๊ฑฐํ ๊ฒ ๊ฐ์ต๋๋ค.
์์ฐ, ๊ฟ๋ฒ ๋ฅ์ง๋ฅผ ํ์ ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ญ์์ค! ํ ๋ก ์ ๋ ์ ๋ฐ์ํ๊ธฐ ์ํด ์ด๋ฆ์ ๋ณ๊ฒฝํ์ต๋๋ค.
2-์ธ์ map
์ ์ด๋ฆ์ zipWith
๋ก ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค. :)
์ผ๋ถ ๊ตฌ๋ฌธ์ด ์ ๋ง๋ก ํ์ํ ๊ฒฝ์ฐ [f <- b]
๋๋ ๋๊ดํธ _inside_ ์ดํด์ ๋ํ ๋ค๋ฅธ ๋ง์ฅ๋์ ์ด๋ป์ต๋๊น?
( @JeffBezanson ๋น์ ์ ๋๊ตฐ๊ฐ CJOS๋ Moose.jl์ ์ธ๊น ๋๋ ค์ธ ๋ฟ์
๋๋ค :) ... ์ฐ๋ฆฌ๊ฐ ๊ทธ ๊ธฐ๋ฅ์ ์ป๋๋ค๋ฉด ๋งค๋ด์ผ์ Don't do stupid stuff: I won't optimize that
์น์
์ ๋ฃ์ผ์ญ์์ค)
ํ์ฌ Int[...]
๋ฅผ ์ฐ๊ณ ์๋ค๋ ๊ฒ์ ์์ ์ ํ Int
์ ๋ฐฐ์ด์ ๊ตฌ์ฑํ๊ณ ์์์ ๋ํ๋
๋๋ค. ๊ทธ๋ฌ๋ Int(x)
๊ฐ Int
๋ฅผ ํจ์๋ก ์ ์ฉํ์ฌ $ x
๋ฅผ Int
๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒฝ์ฐ Int[...]
๋ฅผ " Int
์ ์ฉ"์ ์๋ฏธํ๋ ๊ฒ์ผ๋ก ์๊ฐํ ์๋ ์์ต๋๋ค. Int
์ ํ์ ๊ฐ์ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์ Int[v]
๋ฅผ ์ฐ๋ ๊ฒ์ [ Int(x) for x in v ]
์ ๊ฐ๊ณ Int[ f(x) for x in v ]
๋ [ Int(f(x)) for x in v ]
์ ๊ฐ์ต๋๋ค. ๋ฌผ๋ก , ์ฒ์์ Int[ f(x) for x in v ]
๋ฅผ ์์ฑํ๋ ์ ํธ๋ฆฌํฐ์ ์ผ๋ถ๋ฅผ ์์ด๋ฒ๋ ธ์ต๋๋ค. ์ฆ, ์์ โโ์ ํ์ด Int
์์ ์ ์ ์ผ๋ก ์ ์ ์์ต๋๋ค. ํ์ง๋ง Int(x)
๋ฅผ ์ ์ฉํ๋ฉด Int
์ ํ์ ๊ฐ์ ์์ฑํด์ผ ํฉ๋๋ค(๋ถํฉ๋ฆฌํ ์ ์ฝ ์กฐ๊ฑด์ด ์๋). ๊ทธ๋ฌ๋ฉด ํด๋น ์์ฑ์ ๋ณต๊ตฌํ ์ ์์ต๋๋ค.
๋ ๋ง์ ๋ฒกํฐํ/์์์ ๊ณ ์์ด ์ง์ฅ์ผ๋ก ๋๋ฅผ ๊ณต๊ฒฉํฉ๋๋ค. Int[x, y]
์(๋) ๋ฌด์์ ํ ๊น์? ์๋๋ฉด ๋ ๋์ Vector{Int}[x]
?
๋๋ ๊ทธ๊ฒ์ด ์ต๊ณ ์ ์์ด๋์ด๋ผ๊ณ ๋งํ๊ฑฐ๋ ์ฌ์ง์ด ๊ทธ๊ฒ์ ์นํธํ๋ ๊ฒ์ด ์๋๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๊ทธ ์์ฒด๊ฐ ์ฝ๊ฐ์ ํดํน์ธ ๊ธฐ์กด ์ฌ์ฉ๋ฒ๊ณผ _์์ ํ_ ์ถฉ๋ํ์ง ์๋๋ค๋ ์ ์ ์ง์ ํ๋ ๊ฒ์
๋๋ค. ๊ธฐ์กด ์ฌ์ฉ์ ๋ณด๋ค ์ผ๊ด๋ ํจํด์ ์ผ๋ถ๋ก ๋ง๋ค ์ ์๋ค๋ฉด ๊ทธ๊ฒ์ด ์น๋ฆฌ๊ฐ ๋ ๊ฒ์
๋๋ค. f[v,w]
๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ช
๋ฐฑํ ์ ํ์ [ f(x,y) for x in v, y in w ]
๋๋ map(f,v,w)
์ด์ง๋ง ์์ง ๋ ๋ง์ ์ ํ์ด ์์ต๋๋ค.
a.(b)
๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋น ๋ฅธ ํ
์คํธ๋ฅผ ์คํํ์ผ๋ฉฐ ์ผ์์์ ~4,000๊ฐ์ julia ์์ค ํ์ผ ์ค 54๊ฐ์์๋ง ์ฌ์ฉ๋ฉ๋๋ค( https://gist.github.com/jakeboewski/104458397f2e97a3d57d).
์์ ํ ์ถฉ๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. T[x]
๋ "๋ชจ์" T --> Array{T}
์ด๊ณ map
๋ Array{T} --> Array{S}
๋ชจ์์
๋๋ค. ๊ทธ๊ฒ๋ค์ ๊ฑฐ์ ํธํ๋์ง ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ ค๋ฉด Vector{T}
์ ์์ฑ์๋ก์ T[x,y,z]
๋ฅผ ํฌ๊ธฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. I
๊ฐ ๋ฒกํฐ์ธ ์ผ๋ฐ ์ด์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ A[I]
map(i->A[i], I)
๋ก ๋ณผ ์ ์์ต๋๋ค. ๋ฐฐ์ด์ "์ ์ฉ"ํ๋ ๊ฒ์ ํจ์๋ฅผ ์ ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค(๋ฌผ๋ก matlab์์๋ ๋์ผํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค). ๊ทธ๋ฐ ์๋ฏธ์์ ๊ตฌ๋ฌธ์ ์ค์ ๋ก ์๋ํ์ง๋ง ํ๋ก์ธ์ค์์ ์ ํ์ด ์ง์ ๋ ๋ฒกํฐ ๊ตฌ๋ฌธ์ ์๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์์ ๊ตฌ๋ฌธ์ ๋ํด ํ ๋ก ํ๋ ๊ฒ์ด ๋ ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ธ map
๋น ๋ฅด๊ฒ ๋ง๋๋ ๋ฐ ๋ฐฉํด๊ฐ ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ถ๋ช
ํ map
๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๊ฒ์ด ๋ ์ค์ํฉ๋๋ค. ๊ทธ๋ฌ๋ sin(x)
์์ map(sin, x)
๋ก ์ด๋ํ๋ ๊ฒ์ ์ฌ์ฉ์ฑ ๊ด์ ์์ ๋งค์ฐ ์ค์ํ๋ฏ๋ก ๋ฒกํฐํ๋ฅผ ์ ๋ง๋ก ์์ ๊ธฐ ์ํด์๋ ๊ตฌ๋ฌธ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
๊ทธ๋ฌ๋ sin(x)์์ map(sin, x)์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ์ฌ์ฉ์ฑ ๊ด์ ์์ ๋งค์ฐ ์ค์ํ๋ฏ๋ก ๋ฒกํฐํ๋ฅผ ์ ๋ง๋ก ์์ ๊ธฐ ์ํด์๋ ๊ตฌ๋ฌธ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
์์ ํ ๋์ํ์ต๋๋ค.
f[x]
๊ฐ ํ์ฌ ํ์ํ๋ ๋ฐฐ์ด ๊ตฌ์ฑ Int[x, y]
๋ฑ๊ณผ ๊ฑฐ์ ์ผ์นํ์ง ์๋๋ค๋ @JeffBezanson ์ ์๊ฒฌ์ ๋์ํฉ๋๋ค.
sin.
.sin
๋ฅผ ์ ํธํ๋ ๋ ๋ค๋ฅธ ์ด์ ๋ Base.(+)
๋ฅผ ์ฌ์ฉํ์ฌ +
Base
(ํ ๋ฒ a.(b)
๊ฐ ์ ๊ฑฐ๋จ).
๋ชจ๋์ด ์์ฒด sin
(๋๋ ๋ฌด์์ด๋ ) ํจ์๋ฅผ ์ ์ํ๊ณ ๋ฒกํฐ์์ ํด๋น ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ Module..sin(v)
๋ฅผ ์ํํฉ๋๊น? Module.(.sin(v))
? Module.(.sin)(v)
? .Module.sin(v)
?
์ด๋ฌํ ์ต์ ์ค ์ด๋ ๊ฒ๋ ๋ ์ด์ ์ข์ง ์์ต๋๋ค.
๋๋ ์ด ํ ๋ก ์ด ๋ฌธ์ ์ ํต์ฌ์ ๋์น๊ณ ์๋ค๊ณ ๋๋๋ค. ์ฆ, ๋จ์ผ ์ธ์ ํจ์๋ฅผ ์ปจํ
์ด๋์ ๋งคํํ ๋ map(func, container)
๊ตฌ๋ฌธ์ด _์ด๋ฏธ_ ๋ช
ํํ๊ณ ๊ฐ๊ฒฐํ๋ค๊ณ ๋๋๋๋ค. ๋์ , ์นด๋ ๋ง์ ๋ํ ๋ ๋์ ๊ตฌ๋ฌธ์ ์ด์ ์ ์ป์ ์ ์๋ค๊ณ ์๊ฐํ๋ ์ฌ๋ฌ ์ธ์๋ฅผ ์ฒ๋ฆฌํ ๋๋ง์
๋๋ค.
map(x->func(x,other,args), container)
์ ์์ธํ ์ ๋ณด๋ฅผ ์๋ก ๋ค๊ฑฐ๋ ํํฐ ์์
์ ์ฐ๊ฒฐํ์ฌ filter(x->func2(x[1]) == val, map(x->func1(x,other,args), container))
๋ฅผ ์
ํ์ํค์ญ์์ค.
์ด๋ฌํ ๊ฒฝ์ฐ์๋ ์ง๋ ๊ตฌ๋ฌธ์ ๋จ์ถํ๋ ๊ฒ์ด ๋ณ๋ก ๋์์ด ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด ํน๋ณํ ๋์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์๋์ง๋ง a) ์ฝ์ map
๊ฐ ๋ง์ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ;)
IIRC, Haskell์์ ์์ filter ((==val) . func2 . fst) $ map (func1 other args) container
๋ func1
์ธ์ ์์๋ฅผ ์ฝ๊ฐ ๋ณ๊ฒฝํ์ฌ ์์ฑํ ์ ์์ต๋๋ค.
elm์์ .func
๋ x->x.func
๋ก ์ ์๋๋ฉฐ ์ด๊ฒ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. elm records ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. map
์ ๋ํด ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ด๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ข์ํ๋ค.
Julia์์๋ ๋ง์ ์ธ์ด์์์ ๊ฐ์ด ํ์ฅ ์ก์ธ์ค๊ฐ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค.
์, Julia์ ํ๋๊ฐ "๊ฐ์ธ"์ฉ์ผ๋ก ๋ ๋ง์ด ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์๋ ๋ ๊ด๋ จ์ฑ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ ์ก์ธ์ค ์ค๋ฒ๋ก๋์ ๋ํ ์ง์์ ์ธ ๋ ผ์๋ก ์ธํด ๋ ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค.
$#$ .+
์ ๋น๋์นญ์ด ์๋ ๊ฒฝ์ฐ f.(x)
์ ๋ ๋ฌธ์ ๊ฐ ์๋ ์๋ฃจ์
์ฒ๋ผ ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ .
์ ์์ง์ ์ฐ๊ด์ "์์๋ณ ์์
"์ ์ ์งํ๋ ๊ฒ์ ์ข์ ์๊ฐ์
๋๋ค.
ํ์ฌ ํ์ํ๋ ๋ฐฐ์ด ๊ตฌ์ฑ์ด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ์ ์๋ ๊ฒฝ์ฐ func[v...]
๋ฅผ map(func, v...)
๋ก ๋ณํํ ์ ์์ผ๋ฉฐ, ๊ทธ๋ฌ๋ฉด ๋ฆฌํฐ๋ด ๋ฐฐ์ด์ T[[a1, ..., an]]
(ํ์ฌ T[a1, ..., an]
๋์ )๋ก ์์ฑํ ์ ์์ต๋๋ค.
sinโv
๋ ์์ฐ์ค๋ฝ๊ณ ( v
๋ฐฐ์ด์ด ์ธ๋ฑ์ค์์ ํฌํจ๋ ๊ฐ์ผ๋ก์ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ณด์ผ ๋), ๋๋ ๋ ๊ฐ๋จํ sin*v
๋๋ v*[sin]'
( *(x, f::Callable)
) ๋ฑ์ ์ ์ํด์ผ ํฉ๋๋ค.
์๋ก์ด ์๊ฐ์ผ๋ก ์ด ๋ฌธ์ ๋ก ๋์์์ f.(x)
๊ฐ ์์ฃผ ์์ฐ์ค๋ฌ์ด ๊ตฌ๋ฌธ์ผ๋ก ๋ณด์ผ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. f.
๋ฐ (
๋ก ์ฝ๋ ๋์ f
๋ฐ .(
๋ก ์ฝ์ ์ ์์ต๋๋ค. .(
๋ ์์ ์ ์ผ๋ก (
ํจ์ ํธ์ถ ์ฐ์ฐ์์ ์์๋ณ ๋ฒ์ ์ด๋ฉฐ .+
๋ฐ ์น๊ตฌ์ ์์ ํ ์ผ์นํฉ๋๋ค.
.(
๊ฐ ํจ์ ํธ์ถ ์ฐ์ฐ์๋ผ๋ ์๊ฐ์ ์ ๋ฅผ ๋งค์ฐ ์ฌํ๊ฒ ๋ง๋ญ๋๋ค.
@johnmyleswhite ์์ธํ ์ดํด๋ณผ๊น์? ๋๋ ๊ตฌ๋ฌธ์ ์ง๊ด์ฑ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค. ๋๋ ๊ธฐ์ ์ ๊ตฌํ์ ๋ํ ๊ฒ์ด ์๋๋ผ ๋๋จธ์ง ์ธ์ด์์ ์๊ฐ์ ์ผ๊ด์ฑ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค.
๋์๊ฒ (
๋ ์ธ์ด ์๋ฏธ์ ์ผ๋ถ๊ฐ ์๋๋๋ค. ๋จ์ง ๊ตฌ๋ฌธ์ ์ผ๋ถ์ผ ๋ฟ์
๋๋ค. ๋ฐ๋ผ์ .(
์ (
๊ฐ ๋ค๋ฅด๊ฒ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ช
ํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ ์๋ call
Expr
$ ๋์ multicall
Expr
$๋ฅผ ์์ฑํฉ๋๊น?
์๋์. ๋ด๊ฐ ๋งํ๋ฏ์ด ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ํธ์ถ ๊ตํ์์ด ์์ด์ผ ํ๋ค๋ ์๋ฏธ๋ ์ ํ ์๋๋๋ค. ์์๋ณ ์์ ์ ๋ํด _์๊ฐ์ ์ผ๋ก_ ์ผ๊ด๋ ๊ตฌ๋ฌธ์ ์ฐพ์ผ๋ ค๊ณ ํฉ๋๋ค.
๋์๊ฒ ์ด๋ฌํ ์ต์ ์ ์์ ๋ ๊ฒ์ ๋ค์ค ์ธ์ ํจ์๋ฅผ ๋ฒกํฐํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ ํ ์ ์๋ ๋จ์ผํ ๋ฐฉ๋ฒ์ ์์ผ๋ฉฐ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ง์ํ๊ธฐ์ ์ถฉ๋ถํ ์ผ๋ฐ์ ์ธ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๋ค์ฐจ์ ๋ฐฐ์ด ์ดํด์ ๋งค์ฐ ์ ์ฌํด ๋ณด์ด๊ธฐ ์์ํฉ๋๋ค.
๋ค์ค ์ธ์ map
๊ฐ ๋ชจ๋ ์ธ์๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ์ ํ์ค์
๋๋ค.
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ํ๋ค๋ฉด ๋๋ .( map ์ ๋ํ ํธ์ถ์ ์ํ ๊ตฌ๋ฌธ์ ๋ง๋ค ๊ฒ์
๋๋ค. ๊ทธ ๊ตฌ๋ฌธ์
์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ๊ทธ๋ ๊ฒ ์ข์ง๋ ์์ง๋ง ์ด๋ฌํ ์ธก๋ฉด์์๋ ๊ด์ฐฎ์ ๊ฒ์
๋๋ค.
๋ค์ค ์ธ์ ํจ์์ ๋ํด ์ฌ๋ฌ ์ผ๋ฐํ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ฌ์ค์ ์ ์ด๋ ์ผ๋ถ ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ง์ํ๋ ๊ฒ์ ๋ฐ๋ํ ์ ์์ต๋๋ค. ๋ง์น ํ๋ ฌ ์ ์น๊ฐ ํ ์์ ๋ํด ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ์ผ๋ฐํ๋ ์ ์๋๋ผ๋ ์ ์ฉํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ์๋ฃจ์
์ ์ ํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ฐ๋ฅํ ์ ํ์ https://github.com/JuliaLang/julia/issues/8389#issuecomment -55953120(๋ฐ ๋ค์ ์๊ฒฌ)์์ ์ด๋ฏธ ๋
ผ์๋์์ต๋๋ค. @JeffBezanson ์ด ๋งํ๋ฏ์ด map
์ ํ์ฌ ๋์์ ํฉ๋ฆฌ์ ์
๋๋ค. ํฅ๋ฏธ๋ก์ด ๊ธฐ์ค์ @vectorize_2arg
๋ฅผ ๋์ฒดํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
์ ์์ ์ sin.(x)
์ x .+ y
๊ฐ ๊ณต์กดํ๋ ๊ฒ์ด ์ด์ํ๋ค๋ ๊ฒ์
๋๋ค. ์ฐจ๋ผ๋ฆฌ .sin(x) -> map(sin, x)
์ x .+ y -> map(+, x, y)
๋ฅผ ๊ฐ๊ณ ์ถ์ต๋๋ค.
.+
๋ ์ค์ ๋ก broadcast
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ํ ์ ๋ง์์ ๋์จ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์์ด๋์ด:
sin:x
. ์ฌ๋ฌ ์ฃผ์ฅ์ผ๋ก ์ ์ผ๋ฐํ๋์ง ์์ต๋๋ค.sin.[x]
--- ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ง๋ง ํ์ฌ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.sin@x
--- ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์์ง๋ง ๊ฐ๋ฅํ ์๋ ์์๋๋ ์ฐ๋ฆฌ์๊ฒ ์ด๊ฒ์ด ํ์ํ๋ค๊ณ ํ์ ํ์ง ์์ต๋๋ค.
๋๋. f.(x)
๊ฐ ์ฌ๊ธฐ์์ ๊ฐ์ฅ ์ข์ ์ต์
์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ง์์ ๋ค์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ชจ๋ ์ข
๋ฅ์ ๋ฒกํฐํ๋ ํจ์, ํนํ int()
์ ๊ฐ์ ์์ฑ์ ํผํ ์ ์์ต๋๊น? ์ด๊ฒ์ด ์ ๊ฐ https://github.com/JuliaLang/julia/issues/8389์์ ์ด ํ ๋ก ์ ์์ํ๊ฒ ๋ง๋ ์ด์ ์
๋๋ค.
์ฌ๋๋ค์ด map(func, x)
๋ฅผ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํด์ผ ํฉ๋๋ค. ํ์ดํ์ด ๋ง์ง ์๊ณ ๋ค๋ฅธ ์ธ์ด์์ ์จ ์ฌ๋์ด๋ผ๋ฉด ์ฆ์ ์ ์ ์์ต๋๋ค.
๋ฌผ๋ก ๋น ๋ฅธ์ง ํ์ธํ์ญ์์ค.
๋ค, ํ์ง๋ง ๋ํ์์ผ๋ก ์ฌ์ฉํ๊ธฐ์๋ ๋งค์ฐ ๊ณ ํต์ค๋ฝ์ต๋๋ค. ๊ทธ๊ฒ์ R์์ ์ค๋ ์ฌ๋๋ค์๊ฒ ํฐ ์ฑ๊ฐ์ฌ์ผ ๊ฒ์ ๋๋ค(์ ์ด๋ ๋ค๋ฅธ ์ธ์ด์ ๋ํด์๋ ์ ๋ชจ๋ฆ ๋๋ค). ๊ทธ๋ฆฌ๊ณ Julia๊ฐ ๋ฐ์ดํฐ ๋ถ์์ ์ ํฉํ์ง ์๋ค๋ ๋๋์ ์ฃผ๊ธฐ ์ํด ์ด๊ฒ์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์ผ๊ด์ฑ์
๋๋ค. log
, exp
๋ฑ์ ํฌํจํ์ฌ ํ์ฌ ๋ฒกํฐํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ธฐ๊บผ์ด ์ ๊ฑฐํ๊ณ ์ฌ๋๋ค์๊ฒ map
๋์ map๋ฅผ ์ฌ์ฉํ๋๋ก ์์ฒญํ์ง ์๋ ํ ์ด ๊ฒฐ์ ์ ์ค์ฉ์ฑ์ ๋ํ ํฅ๋ฏธ๋ก์ด ํ
์คํธ), ์ธ์ด๊ฐ ์ผ๊ด์ฑ์ด ์์ด ํจ์๊ฐ ๋ฒกํฐํ๋์๋์ง ์ฌ๋ถ(๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ธ์์ ๋ํด)๋ฅผ ๋ฏธ๋ฆฌ ์๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๋ง์ ๋ค๋ฅธ ์ธ์ด๋ค์ด ๋ช ๋
๋์ map
๋ฅผ ์ฌ์ฉํด ์์ต๋๋ค.
๋ชจ๋ ๊ฒ์ ๋ฒกํฐํํ๋ ๊ฒ์ ์ค๋จํ๋ ค๋ ๊ณํ์ ์ดํดํ๋ฉด์ ๋๋ถ๋ถ์/๋ชจ๋ ๋ฒกํฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ํญ์ ์ ๋ต์ ์ผ๋ถ์์ต๋๋ค.
์, _๋ฌผ๋ก _ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ๋ฒกํฐํํ๋ ๊ฒ์ ์ค๋จํ ๊ฒ์
๋๋ค. ๋ถ์ผ์น๊ฐ ์ด๋ฏธ ์กด์ฌํฉ๋๋ค. sin
, exp
๋ฑ์ด ์์์ ์ผ๋ก ๋ฐฐ์ด์ ๋งคํ๋์ด์ผ ํ๋ ํ์คํ ์ด์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ํจ์๊ฐ ๋ฒกํฐํ๋๊ฑฐ๋ ๋ฒกํฐํ๋์ด์ผ ํ๋์ง๋ฅผ ์๋ ๊ฒ์ ์ด๋ฏธ ์ด๋ ต์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์์๊ฒ ๋ชจ๋ ์ ์ ํ ํจ์์ @vectorize
๋ฅผ ๋ฃ์ผ๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์
๋๋ค. ํจ์๋ฅผ ์์ฑํ ์ ์์ด์ผ ํ๋ฉฐ ๋๊ตฐ๊ฐ๊ฐ ๋ชจ๋ ์์์ ๋ํด ๊ณ์ฐํ๋ ค๋ ๊ฒฝ์ฐ map
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฒกํฐํ๋ ์ํ ํจ์๋ฅผ ์ ๊ฑฐํ๋ฉด ์ด๋ป๊ฒ ๋๋์ง ์์ํด ๋ด ์๋ค.
exp(x)
map(exp, x)
์ ์ฐ๋ ๊ฒ์ ๋ง์์ ๋ค์ง ์์ต๋๋ค. ๋น๋ก ํ์๊ฐ ์ฝ๊ฐ ๋ ์งง๊ณ ๊น๋ํ๊ธด ํ์ง๋ง์. ๊ทธ๋ฌ๋ ์ฑ๋ฅ์๋ _ํฐ_ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋ฒกํฐํ๋ ๊ธฐ๋ฅ์ ๋ด ์ปดํจํฐ์ ์ง๋๋ณด๋ค ์ฝ 5๋ฐฐ ๋น ๋ฆ
๋๋ค.exp(0.5 * abs2(x - y))
๋ณตํฉ ํํ์์ ๊ณ ๋ คํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.# baseline: the shortest way
exp(0.5 * abs2(x - y)) # ... takes 0.03762 sec (for 10^6 elements)
# using map (very cumbersome for compound expressions)
map(exp, 0.5 * map(abs2, x - y)) # ... takes 0.1304 sec (about 3.5x slower)
# using anonymous function (shorter for compound expressions)
map((u, v) -> 0.5 * exp(abs2(u - v)), x, y) # ... takes 0.2228 sec (even slower, about 6x baseline)
# using array comprehension (we have to deal with two array arguments)
# method 1: using zip to combine the arguments (readability not bad)
[0.5 * exp(abs2(u - v)) for (u, v) in zip(x, y)] # ... takes 0.140 sec, comparable to using map
# method 2: using index, resulting in a slightly longer statement
[0.5 * exp(abs2(x[i] - y[i])) for i = 1:length(x)] # ... takes 0.016 sec, 2x faster than baseline
๋ฒกํฐํ๋ ์ํ ํจ์๋ฅผ ์ ๊ฑฐํ๋ ค๋ ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ๊ณผ ์ฑ๋ฅ ๋ชจ๋์์ ํ์ฉ๋๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด ์ดํด์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋๋ ๋ฒกํฐํ๋ ์ํ๋งํผ ํธ๋ฆฌํ์ง๋ ์์ต๋๋ค.
๋ฒกํฐํ๋ ๋ฒ์ ์ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ -1์ ๋๋ค. ์ค์ ๋ก VML ๋ฐ Yeppp์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฒกํฐํ๋ ๋ฒ์ ์ ๋ํด ํจ์ฌ ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก ์ด๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ๊ธฐ๋ณธ์ธ์ง ์๋์ง๋ ๋ค๋ฅธ ๋ ผ์์ด์ ๋ ํฐ ๋ ผ์์ด์ง๋ง, ๊ทธ ํ์์ฑ์ ํ์ค์ ์ด๋ฉฐ ์ฑ๋ฅ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ฒ๋ณด๋ค ๋์ ์ ์์ต๋๋ค.
@lindahua ๋ฐ @ViralBShah : map
์ ๊ฐ์ ํ๊ธฐ ์ ์ ๋ฒกํฐํ๋ ํจ์๋ฅผ ์ ๊ฑฐํ ๊ฒ์ด๋ผ๋ ๊ฐ์ ์ ๊ทผ๊ฑฐํ ์ฐ๋ ค๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ์ ์ํ ์ฌ๋์ ์๋ฌด๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ @lindahua ์ ์๊ฐ ๊ฝค ๋งํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฒกํฐํ๋ ๊ตฌ๋ฌธ์ ๋ค๋ฅธ ์๋ฃจ์ ๋ณด๋ค ํจ์ฌ ๋ ํ๋ฅญํ๊ณ ์ํ ๊ณต์์ ํจ์ฌ ๋ ๊ฐ๊น์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์๋ ๊ฒ์ด ๋งค์ฐ ๋์ ๊ฒ์ด๊ณ ๋ค๋ฅธ ๊ณผํ ์ธ์ด์์ ์ค๋ ์ฌ๋๋ค์ ์๋ง๋ ์ด๊ฒ์ Julia์์ ๋ถ์ ์ ์ธ ์ ์ผ๋ก ์๊ฐํ ๊ฒ์ ๋๋ค.
๋๋ ๋ชจ๋ ๋ฒกํฐํ๋ ํจ์( map
๊ฐ ์ถฉ๋ถํ ๋น ๋ฅผ ๋)๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์ด๋ป๊ฒ ์งํ๋๋์ง ํ์ธํฉ๋๋ค. ์ ๋ ํธ๋ฆฌํ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ํ ๊ด์ฌ์ด ๊ทธ ์์ ์์ ํจ์ฌ ๋ ๊ฐ์์ ์ผ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ผ๋ฉฐ, ์ฌ์ค์ด ๋ฐํ์ง๋ฉด ์ฌ์ ํ ์ถ๊ฐํด์ผ ํ ๋์
๋๋ค.
Julia๋ ๋ํํ ์ฌ์ฉ(์ด ๊ฒฝ์ฐ ๊ธด ํํ์์ ์ ๋ ฅํ๊ธฐ ๊ท์ฐฎ์)๊ณผ ์ํ์ ๊ณ์ฐ(์ฝ๋๋ฅผ ์ฝ์ ์ ์๋๋ก ์์์ ๊ฐ๋ฅํ ํ ์ํ ํํ์์ ๊ฐ๊น์์ผ ํจ)์ ๊ฐ์กฐํ๊ธฐ ๋๋ฌธ์ Julia๊ฐ ๋ค๋ฅธ ๋ง์ ์ธ์ด์ ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด ๋ถ๋ถ์ ์ผ๋ก Matlab, R ๋ฐ Numpy๊ฐ ๋ฒกํฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ด์ ์ ๋๋ค(๋ค๋ฅธ ์ด์ ๋ ๋ฌผ๋ก ์ฑ๋ฅ์ด๋ฉฐ Julia์์๋ ์ฌ๋ผ์ง ์ ์๋ ๋ฌธ์ ์ ๋๋ค).
ํ ๋ก ์์ ๋ด ๋๋์ ๋ฒกํฐํ๋ ์ํ์ ์ค์์ฑ์ด ๊ณผ์ํ๊ฐ๋์๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ์ค, ๋ฒกํฐํ๋ ์ํ์ ์ฃผ์ ์ฅ์ ์ค ํ๋๋ ํํ์ ๊ฐ๊ฒฐํจ์ ์์ต๋๋ค. "for-loop์ด ๋๋ฆฐ ์ธ์ด"์ ๋ํ ์์๋ฐฉํธ ์ด์์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
y = exp(x)
์ ๋น๊ต
for i = 1:length(x)
y[i] = exp(x[i])
end
์ ์๋ ๋ถ๋ช ํ ํ์๋ณด๋ค ํจ์ฌ ๋ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฝ์ต๋๋ค. Julia๊ฐ ๋ฃจํ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ง๋ ๋ค๋ ์ฌ์ค์ด ์ฐ๋ฆฌ๊ฐ ํญ์ ์ฝ๋๋ฅผ ์ญ๋ฒกํฐํํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ์ด๊ฒ์ ์ ๊ฒ๋ ์๋นํ ์ญํจ๊ณผ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ์์ฐ์ค๋ฝ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ์ฅ๋ คํด์ผ ํฉ๋๋ค. ํํธ์ผ๋ก, ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ํฉํ์ง ์์ ์ปจํ ์คํธ์์ ๋ณต์กํ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ฒกํฐํ๋ ํจ์๋ฅผ ๋นํ์ด์๋ ์ ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ฉด์ ๋ฒกํฐํ๋ ์ํ์ด ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ผ ๋๋ง๋ค ์ฌ์ฉ์ ์ง์ํด์ผ ํฉ๋๋ค.
์ค์ ๋ก ์์์ ์ซ์ ๋ฐฐ์ด์ ๋งคํํ๋ ๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์์
์ด๋ฏ๋ก ๋ฒ๊ฑฐ๋กญ์ง ์๊ฒ ํ๊ธฐ ์ํด ๋
ธ๋ ฅํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ฒกํฐํ๋ ์ฝ๋๋ ๊ฐ์ฅ ์์ฐ์ค๋ฝ๊ณ ๊ฐ๊ฒฐํ ๋ฐฉ์์ผ๋ก ์ ์ง๋ฉ๋๋ค. ์ฑ๋ฅ์ ์ ์ณ๋๊ณ , ํนํ ๋ค์ค ์ธ์๊ฐ ์๋ ๋ณตํฉ ํํ์์ ๊ฒฝ์ฐ map
ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ๋ณด๋ค ์ฌ์ ํ ๋ซ์ต๋๋ค.
์ฐ๋ฆฌ๋ ํ์คํ ๋ชจ๋ ๊ฒ์ ๋ฒกํฐํ๋ ๋ฒ์ ์ ์ํ์ง ์์ง๋ง, ๋ฒกํฐํํ๊ธฐ ์ํด ๋งค๋ฒ ๋งต์ ์ฌ์ฉํ๋ ๊ฒ์ ์์์ ์ธ๊ธํ Dahua ๋๋ฌธ์ ์ง์ฆ๋ ๊ฒ์ ๋๋ค.
๋งต์ด ๋นจ๋๋ค๋ฉด ํ์คํ ๋ ์๊ณ ์๋ฏธ ์๋ ๋ฒกํฐํ๋ ํจ์ ์ธํธ์ ์ง์คํ ์ ์์์ ๊ฒ์ ๋๋ค.
๋๋ ๊ฐ๊ฒฐํ ์ง๋ ํ๊ธฐ๋ฒ์ ์ง์งํ๋ ์ธก๋ฉด์์ ๊ฐํ๊ฒ ๋ด๋ ค์จ๋ค๊ณ ๋งํด์ผ ํ๋ค. ๋๋ ๊ทธ๊ฒ์ด ์๋ก ๋ค๋ฅธ ์๊ตฌ๋ค ์ฌ์ด์ ์ต์์ ํํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๋ฒกํฐํ๋ ํจ์๋ฅผ ์ข์ํ์ง ์๋๋ค. ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์จ๊น๋๋ค. ํจ์์ ๋ฒกํฐํ๋ ๋ฒ์ ์ ๋ง๋๋ ์ด๋ฌํ ์ต๊ด์ ๋ฏธ์คํฐ๋ฆฌ ์ฝ๋๋ก ์ด์ด์ง๋๋ค. ํจํค์ง์ f
ํจ์๊ฐ ๋ฒกํฐ์์ ํธ์ถ๋๋ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ํจ์๊ฐ ๋ฌด์์ ํ๋์ง์ ๋ํ ์์ด๋์ด๊ฐ ์๋๋ผ๋ ์์๋ณ๋ก ์ํํ๋์ง ๋๋ ๋ฒกํฐ ์ ์ฒด์์ ์๋ํ๋์ง ์ฌ๋ถ๋ฅผ ์ฝ๋๋ฅผ ์ฝ์ผ๋ฉด ํ์ ํ ์ ์์ต๋๋ค. ๊ณผํ ์ปดํจํ
์ธ์ด๊ฐ ์ด๋ฌํ ๋ฒกํฐํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ด๋ ฅ์ด ์์๋ค๋ฉด ์ง๊ธ์ฒ๋ผ ๊ฑฐ์ ์์ฉํ์ง ์์์ ๊ฒ์
๋๋ค.
๋ํ ํจ์๊ฐ ์ฌ์ฉ๋๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ๋ฒกํฐํ๋ ๋ฒ์ ์ ํจ์๋ฅผ ์์ฑํ๋๋ก ์์์ ์ผ๋ก ๊ถ์ฅ๋๋ ์ํฉ์ผ๋ก ์ด์ด์ง๋๋ค.
์งํ ์ค์ธ ์์ ์ ๋ํด ๊ฐ์ฅ ๋ช ์์ ์ธ ์ฝ๋๋ ๋ฃจํ์ด์ง๋ง @lindahua ๊ฐ ๋งํ๋ฏ์ด ๋งค์ฐ ์ฅํฉํด์ง๋ฉฐ ํนํ ๋ํ์ ์ฌ์ฉ์ ์๋ฏธํ๋ ์ธ์ด์์ ์์ฒด ๋จ์ ์ด ์์ต๋๋ค.
์ด๊ฒ์ map
์ ์ถฉ์์ผ๋ก ์ด์ด์ง๋ฉฐ ์ด์์ ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ถฉ๋ถํ ๊ฐ๊ฒฐํ์ง ์๋ค๋ @lindahua ์ ์๊ฒฌ์๋ ์ฌ์ ํ ๋์ํฉ๋๋ค.
@lindahua ์ ๋์ํ์ง ์๋ ๋ถ๋ถ์ ์์ ์ธ๊ธํ ์ด์ ๋ก ๋ฒกํฐํ๋ ํจ์๊ฐ ์ต์ ์ ์ ํ์ด๋ผ๋ ๊ฒ์
๋๋ค. ๋ด ์ถ๋ก ์ผ๋ก ์ด์ด์ง๋ ๊ฒ์ Julia๊ฐ map
์ ๋ํด ๋งค์ฐ ๊ฐ๊ฒฐํ ํ๊ธฐ๋ฒ์ ๊ฐ์ ธ์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
Mathematica๊ฐ ์ฝ์ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ ๋ง ๋งค๋ ฅ์ ์ด๋ผ๋ ๊ฒ์ ์์์ต๋๋ค. Mathematica์์ ์ธ์์ ํจ์๋ฅผ ์ ์ฉํ๊ธฐ ์ํ ์ฝ์ ํ๊ธฐ๋ฒ์ @
์ด๋ฏ๋ก Apply
ํจ์๋ฅผ ๋ฒกํฐ์ f
๋ก ์ง์ ํ๋ฉด f @ vector
์
๋๋ค. . ํจ์ ๋งคํ์ ๋ํ ๊ด๋ จ ์ฝ์ ํ๊ธฐ๋ฒ์ /@
์ด๋ฏ๋ก f
๋ฅผ f /@ vector
์ ๊ฐ์ด ๋ฒกํฐ์ ๋งคํํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ๋งค๋ ฅ์ ์ธ ํน์ฑ์ด ์์ต๋๋ค. ๋ ๋จ์ถํ์ ๋ชจ๋ ๊ฐ๊ฒฐํฉ๋๋ค. ๋ ๋ค @
๊ธฐํธ๋ฅผ ์ฌ์ฉํ๋ค๋ ์ฌ์ค์ ๊ทธ๋ค์ด ํ๋ ์ผ ์ฌ์ด์ ๊ด๊ณ๊ฐ ์์์ ๊ฐ์กฐํ์ง๋ง ์ง๋์ /
๋ ๋งคํํ ๋์ ์ธ์ ๋งคํํ ๋ ๋ช
ํํ๊ฒ ํ๊ธฐ ์ํด ์ฌ์ ํ ์๊ฐ์ ์ผ๋ก ๊ตฌ๋ณ๋ฉ๋๋ค. ์๋๋ค. ์ด๊ฒ์ Julia๊ฐ Mathematica์ ํ๊ธฐ๋ฒ์ ๋งน๋ชฉ์ ์ผ๋ก ๋ณต์ฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋งํ๋ ๊ฒ์ด ์๋๋ผ ๋งคํ์ ๋ํ ์ข์ ํ๊ธฐ๋ฒ์ด ๋งค์ฐ ๊ฐ์น ์๋ค๋ ๊ฒ๋ฟ์
๋๋ค.
๋๋ ๋ชจ๋ ๋ฒกํฐํ๋ ํจ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ์ํ์ง ์์ต๋๋ค. ๊ทธ ๊ธฐ์ฐจ๋ ์ญ์ ๋ ๋ ์ง ์ค๋์ ๋๋ค. ์คํ๋ ค ๋ฒกํฐํ๋ ํจ์ ๋ชฉ๋ก์ ๊ฐ๋ฅํ ํ ์งง๊ฒ ์ ์งํ๊ณ ๋ฒกํฐํ๋ ํจ์ ๋ชฉ๋ก์ ์ถ๊ฐํ์ง ์๋๋ก ๊ฐ๊ฒฐํ ๋งต ํ๊ธฐ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฌผ๋ก ์ด ๋ชจ๋ ๊ฒ์ map
๋ฐ ์ต๋ช
ํจ์๊ฐ ๋น ๋ฅผ ๋ ์กฐ๊ฑด๋ถ์
๋๋ค. ์ง๊ธ Julia๋ ์ด์ํ ์์น์ ์์ต๋๋ค. ๋ฃจํ๊ฐ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ํจ์๊ฐ ๋ฒกํฐํ๋ ๊ณผํ ์ปดํจํ
์ธ์ด์ ๊ฒฝ์ฐ์์ต๋๋ค. ์ด๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๋์ Julia์์๋ ๋งต ๋ฐ ์ต๋ช
ํจ์๊ฐ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ํจ์๋ฅผ ๋ฒกํฐํํ์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์์ํ ๊ณณ์ผ๋ก ๋์๊ฐ์ง๋ง ๋ค๋ฅธ ์ด์ ๊ฐ ์์ต๋๋ค.
๋ฒกํฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์๋ ํ ๊ฐ์ง ๋จ์ ์ด ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ช
์์ ์ผ๋ก ์ ๊ณตํ๋ ํจ์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฆ, ์๋ฅผ ๋ค์ด sin(x)
๋ ๋ฒกํฐ์ ์ ์ฉํ ๋ ๋น ๋ฅด์ง sin(2*x)
๋ ๋ ๋ฒ ์ํํด์ผ ํ๋ ์ค๊ฐ ๋ฐฐ์ด์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์๊ธฐ ํจ์ฌ ๋๋ฆฝ๋๋ค(๋จผ์ ์ฐ๊ธฐ, ๋ค์ ์ฝ๊ธฐ).
ํ ๊ฐ์ง ์๋ฃจ์
์ vectorizABLE ์ํ ํจ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ์ธ๋ผ์ธ์ ์ํด LLVM์์ ์ฌ์ฉํ ์ ์๋ sin
, cos
๋ฑ์ ๊ตฌํ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ LLVM์ ์ด ๋ฃจํ๋ฅผ ๋ฒกํฐํํ์ฌ ๋งค์ฐ ํจ์จ์ ์ธ ์ฝ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค. Yeppp๋ ์ฌ๋ฐ๋ฅธ ๋ฃจํ ์ปค๋์ ๊ฐ์ง๊ณ ์๋ ๊ฒ ๊ฐ์ง๋ง ์ธ๋ผ์ธ์ ์ํด ๋
ธ์ถํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํจ๋ฌ๋ค์์ผ๋ก์์ ๋ฒกํฐํ์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ถ๋ณต๋ฐ์ ๋ค๋ฅธ ์ปจํ ์ด๋ ์ ํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ ํ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. DataArrays์์ ์ด๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ์ํ๋ ์๋ก์ด ์ปจํ ์ด๋ ์ ํ์ ๋ํ ํจ์๋ฅผ ๋ค์ ๋ฒกํฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์ฒญ๋ ์์ ๋ฉํํ๋ก๊ทธ๋๋ฐ ์ฝ๋๊ฐ ์์ต๋๋ค.
๊ทธ๊ฒ์ @eschnett ์ ์์ ๊ณผ ๊ฒฐํฉํ๋ฉด ๋ค์์ ์ป์ต๋๋ค.
๋ด ์์ ์ ๋ฒกํฐํ๋ ํจ์๋ฅผ ํญ์ ์ ์งํด์ผ ํ๋ค๋ ๊ฒ์ด ์๋๋ผ ๋ฒกํฐํ๋ ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ๋งํผ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค๋ ๊ฒ์
๋๋ค. map
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ง๋ ์ด๊ฒ์ ๋ง์กฑ์ํค์ง ๋ชปํ ๊ฒ์
๋๋ค.
์ผ๋ถ ํจ์์ _vectorizable_ ํ๊ทธ๋ฅผ ์ง์ ํ๋ @eschnett ์ ์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค. ์ปดํ์ผ๋ฌ๋ ์ฌ์ฉ์๊ฐ ๋ฒกํฐํ๋ ๋ฒ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ํ์ง ์๊ณ ๋ ๋ฒกํฐํ ๊ฐ๋ฅํ ํจ์๋ฅผ ๋ฐฐ์ด์ ์๋์ผ๋ก ๋งคํํ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ๋ฒกํฐํ ๊ฐ๋ฅํ ํจ์ ์ฒด์ธ์ ์ตํฉ ๋ฃจํ๋ก ์ตํฉํ ์๋ ์์ต๋๋ค.
@eschnett ์ ์๊ฒฌ์์ ์๊ฐ์ ๋ฐ์ ์๊ฐํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
# The <strong i="11">@vec</strong> macro tags the function that follows as vectorizable
<strong i="12">@vec</strong> abs2(x::Real) = x * x
<strong i="13">@vec</strong> function exp(x::Real)
# ... internal implementation ...
end
exp(2.0) # simply calls the function
x = rand(100);
exp(x) # maps exp to x, as exp is tagged as vectorizable
exp(abs2(x)) # maps v -> exp(abs2(v)), as this is applying a chain of vectorizable functions
์ปดํ์ผ๋ฌ๋ SIMD๋ฅผ ์ฌ์ฉํ ๊ธฐํ๋ฅผ ์๋ณํ์ฌ (ํ์ ์์ค์์) ๊ณ์ฐ์ ๋ค์ ๋ฒกํฐํํ ์๋ ์์ต๋๋ค.
๋ฌผ๋ก @vec
๋ ์ต์ข
์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ ์์ด์ผ ์ฌ๋๋ค์ด ์์ ์ ๊ธฐ๋ฅ์ ๋ฒกํฐํํ ์ ์๋ค๊ณ ์ ์ธํ ์ ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค. @lindahua : ๊ทํ์ ์ค๋ช ์ด ๋ง์ ๋์์ด ๋ฉ๋๋ค.
@vec
๋ @pure
ํจ์๋ฅผ ์ ์ธํ๋ ๊ฒ๊ณผ ๋ค๋ฅผ๊น์?
@vec
๋ ํจ์๊ฐ ์์๋ณ๋ก ๋งคํ๋ ์ ์์์ ๋ํ๋
๋๋ค.
๋ชจ๋ ์์ ํจ์๊ฐ ์ด ๋ฒ์ฃผ์ ์ํ๋ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด sum
๋ ์์ ํจ์์ด๋ฉฐ _vectorizable_์ผ๋ก ์ ์ธํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
$#$5 $#4$#$์ pure
๋ฐ associative
ํ๊ทธ์์ +
sum
์ $# reduce
vec
์์ฑ์ ๋ค์ ํ์์ํฌ ์ ์์ต๋๋ค. reduce
/ foldl
/ foldr
๋ pure
๋ฐ associative
ํจ์๊ฐ ์ฃผ์ด์ก์ ๋ ์๋ํฉ๋๊น? ๋ถ๋ช
ํ ์ด๊ฒ์ ๋ชจ๋ ๊ฐ์์ ๊ฒ์ด์ง๋ง Julia๊ฐ ์ ํ์ ๋ํ ํน์ฑ์ ๋ชจ๋ ์ฐธ์ฌํ๋ค๋ฉด ํจ์์ ๋ํ ํน์ฑ์๋ ๋ชจ๋ ์ฐธ์ฌํ์ฌ ๋ฒกํฐํ์ ๋ํ ์ต์ ๊ธฐ์ ์ ์๋นํ ๊ฐ์ ํ๋ ๊ฒ์ ์์ํ ์ ์์์ต๋๋ค.
์ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ๊ณผ ๋ฐ๋๋๋ ๊ฒ ๊ฐ์ต๋๋ค(Any[] ๋ฐ Dict์ ๋ํ ํน์ ๊ตฌ๋ฌธ์ ์ ๋ฆฌํ ํ). ์ด๋ฌํ ๋ฒกํฐํ๋ ํจ์๋ฅผ ์ ๊ฑฐํ๋ ์ ์ฒด _point_๋ ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ค์ด๊ธฐ ์ํ ๊ฒ์ ๋๋ค(๊ทธ๋ฆฌ๊ณ ์ ๋ ๊ตฌ๋ฌธ์ด ํจ์ ์๋ฏธ๋ก ๊ณผ ๋ฌ๋ผ์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค). ๊ทธ๋ฌ๋ ๊ฐ๊ฒฐํ ์ง๋๊ฐ ์ ์ฉํ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ๊ฐ๋จํ ์ค์์ด map
์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๊น? ์ฌ๊ธฐ์ ์์๋ก $
์ ํํ๊ฒ ์ต๋๋ค. ์ด๊ฒ์ @lindahua ์ ์์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค ๊ฒ์
๋๋ค.
exp(0.5 * abs2(x - y))
์๊ฒ
exp $ (0.5 * abs2 $ (x-y))
์ด์ ์ฌ์ฉ์ ์ ์ ์ค์ ์ฐ์ฐ์์ ๋ํ Haskell๊ณผ ๊ฐ์ ์ง์๋ง ์๋ค๋ฉด ($) = map
ํ ์ค๋ง ๋ณ๊ฒฝ๋ฉ๋๋ค. :)
IMO, ๋ค๋ฅธ ๊ตฌ๋ฌธ ์ ์์ ์๊ฐ์ ์ผ๋ก ๊ธฐ์กด ๊ตฌ๋ฌธ์ ๋๋ฌด ๊ฐ๊น๊ณ ์ฝ๋๋ฅผ ๋ณผ ๋ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ์ ์ ์ ๋ ธ๋ ฅ์ด ๋ ํ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ @vec
์๋ฃจ์
์ด ์ฒ์๋ถํฐ ํผํ๋ ค๋ @vectorize
์ ๋๋ฌด ๊ฐ๊น๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์คํ, ์ผ๋ถ ์ฃผ์ ala #8297์ ์์ผ๋ฉด ์ข์ ๊ฒ์ด๋ฉฐ ๋ฏธ๋์ ๋์์ด ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ ๋๋ํ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฌํ ์คํธ๋ฆผ ์ตํฉ ๊ธฐํ๋ฅผ ์ธ์ํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ต์ ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ๊ฐ์ํ๋ ์๊ฐ์ ์ข์ํ์ง ์์ต๋๋ค.
Infix ๋งต๊ณผ ๋น ๋ฅธ ์ต๋ช ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ํ์ฉํ๋ ๊ฒฝ์ฐ ์์ ์์ฑ์ ๋์์ด ๋ ์ ์์ต๋๋ค.
(x, y) -> exp(0.5 * abs2(x - y)) $ x, y
๋ฒกํฐํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ง์ ํ๋ ๋งฅ๋ฝ์์ ๋ฉ์ง ์๋ก์ด Trait.jl ์ ์์ด๋์ด๋ฅผ ๋น๋ฆด ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๋ฌผ๋ก ์ด ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ํน์ ํน์ฑ์ ๊ฐ์ง julia Type ๋์ Function
์ ํ์ ๊ฐ๋ณ _instances_๊ฐ ๋ฒกํฐํ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ณด๊ณ ์์ต๋๋ค.
์ด์ ์ฌ์ฉ์ ์ ์ ์ค์ ์ฐ์ฐ์์ ๋ํ Haskell๊ณผ ๊ฐ์ ์ง์๋ง ์๋ค๋ฉด
๊ฐ๋ฅํ ํ ์ ์ ์์ ์์ ๋ฐฐ์ด๋ก ์ ์ฒด ํํ์์ ๋ฒกํฐํํ๋ ๊ฒ์ ๋ํ ์ด ๋
ผ์์ ์์ ์ด ์์ต๋๋ค. ๋ฒกํฐํ๋ ๊ตฌ๋ฌธ์ ์ํ๋ ์ฌ์ฉ์๋ ๋ฒกํฐํ๋ exp(x)
์ํ์ง ์์ต๋๋ค. ๊ทธ๋ค์ ๋ค์๊ณผ ๊ฐ์ ํํ์ ์ฐ๊ณ ์ถ์ดํ ๊ฒ์
๋๋ค.
y = โฯ exp(-x^2) * sin(k*x) + im * log(x-1)
๋ง๋ฒ์ฒ๋ผ ๋ฒกํฐํํ๊ฒ ํ์ญ์์ค
ํจ์๋ฅผ "๋ฒกํฐํ ๊ฐ๋ฅ"์ผ๋ก ํ์ํ ํ์๋ ์์ต๋๋ค. ์ด๊ฒ์ ์คํ๋ ค ํจ์๊ฐ ๊ตฌํ๋๊ณ Julia๊ฐ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ฑ์ ๋๋ค. ์๋ฅผ ๋ค์ด C๋ก ๊ตฌํ๋ ๊ฒฝ์ฐ LLVM ์ตํฐ๋ง์ด์ ๊ฐ ๊ณ์ ์ก์ธ์คํ ์ ์๋๋ก LLVM ๋ฐ์ดํธ์ฝ๋(๊ฐ์ฒด ํ์ผ ์๋)๋ก ์ปดํ์ผํด์ผ ํฉ๋๋ค. Julia์์ ๊ตฌํํ๋ ๊ฒ๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค.
๋ฒกํฐํ ๊ฐ๋ฅ์ฑ์ Yeppp ํ๋ก์ ํธ์์ ์์ฃผ ์ ์ค๋ช ๋ ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ณํฉ ์์ .
๋ถํํ๊ฒ๋, ๊ทธ๋ฌํ ๊ตฌํ์ ํ๋์จ์ด ์์กด์ ์ผ ๊ฒ์ ๋๋ค. ์ฆ, ์ด๋ค ํ๋์จ์ด ๋ช ๋ น์ด๊ฐ ํจ์จ์ ์ธ์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด๋ ๋ค๋ฅธ ๊ตฌํ์ ์ ํํด์ผ ํ ์๋ ์์ต๋๋ค. ๋๋ ๊ณผ๊ฑฐ์ ์ด๊ฒ์ C++๋ก ํ๊ณ (https://bitbucket.org/eschnett/vecmathlib/wiki/Home) ์ฝ๊ฐ ๋ค๋ฅธ ๋์(์๋ ๋ฒกํฐํ ๋์ ์๋์ผ๋ก ๋ฒกํฐํ๋๋ ์คํ ์ค ๊ธฐ๋ฐ ์์ ์ปดํ์ผ๋ฌ).
์ฌ๊ธฐ Julia์์๋ (a) ์ปดํ์ผ๋ฌ๊ฐ LLVM์ด ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์๊ณ (b) C++ ๋์ Julia์์ ์ด๊ฒ์ ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ํฉ์ด ๋ ์ฌ์ธ ๊ฒ์ ๋๋ค(๋งคํฌ๋ก ๋ ํ ํ๋ฆฟ).
๊ณ ๋ คํด์ผ ํ ๋ ๋ค๋ฅธ ์ฌํญ์ด ์์ต๋๋ค. IEEE ํ์ค์ ์ผ๋ถ๋ฅผ ํฌ๊ธฐํ๋ฉด ์๋๋ฅผ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ง์ ์ฌ์ฉ์๋ ์๋ฅผ ๋ค์ด ๋น์ ๊ทํ๋ ์ซ์๊ฐ ์ค์ํ์ง ์๊ฑฐ๋ ์
๋ ฅ์ด ํญ์ sqrt(max(Double))
๋ณด๋ค ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋ฌธ์ ๋ ์ด๋ฌํ ๊ฒฝ์ฐ์ ๋น ๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ ์ง ์ฌ๋ถ์
๋๋ค. ๋๋ ์ด๊ฒ์ ๋งค์ฐ ๊ด์ฌ์ด ๋ง๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ทธ ๋์ ์ ํํ ์ฌํ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ์ ํธํ ์๋ ์์ต๋๋ค.
Julia์์ ๋ฒกํฐํ ๊ฐ๋ฅํ exp
ํ๋กํ ํ์
์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฃจํ๋ฅผ ๋ฒกํฐํํ ๋ LLVM์ด ์ํํ๋ ์์
๊ณผ ์ป์ ์ ์๋ ์๋๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ํจ์์ ์ธ์์ ์ ๊ฐ ๊ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋๋ฌด ๋ฌด์ญ์ต๋๊น~
์ฃ์กํฉ๋๋ค. @johnmyleswhite ๊ฐ ์์์ ํธ๋ ์์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ๋ํด ๋งํ ๊ฒ๊ณผ ๋๊ฐ์ ๊ฒ์ ๋ฐ๋ณตํ๊ณ ์๋ค๋ ๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค. ๊ณ์ํ์ญ์์ค.
@eschnett API(ํจ์๊ฐ ๋ฒกํฐํํ ์ ์๋์ง ์ฌ๋ถ)๋ฅผ ๊ตฌํ ์ธ๋ถ ์ ๋ณด(ํจ์๊ฐ ์ปดํ์ผ๋๋ ๋ฐฉ๋ฒ)์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๊ฐ๊ณผ ์ํคํ
์ฒ ์ ๋ฐ์ ๊ฑธ์ณ ์ดํดํ๊ณ ์์ ์ ์ผ๋ก ์ ์งํ๋ ๊ฒ์ ๋งค์ฐ ๋ณต์กํ๊ฒ ๋ค๋ฆฌ๋ฉฐ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํจ์๋ฅผ ํธ์ถํ ๋๋ ์๋ํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด log
๋ openlibm์์ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ๋ฒกํฐํ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๊ฐ์ง๋์ง ์์ต๋๋ค.
OTOH @johnmyleswhite ์ ํน์ฑ์ ์ฌ์ฉํ์ฌ ํจ์์ ์ํ์ ์์ฑ์ด ๋ฌด์์ธ์ง ์ ๋ฌํ๋ ์์ด๋์ด๋ ํ๋ฅญํ ์๋ฃจ์ ์ด ๋ ์ ์์ต๋๋ค. ( @lindahua ๋ ์ ์ ์์ ์ ๊ฐ ์กฐ๊ธ ์ ์ ์ด๋์ ๊ฐ ์ ์ํ ๊ธฐ๋ฅ์ด์ง๋ง, ํน์ฑ์ ์ฌ์ฉํ๋ ์๋ฃจ์ ์ด ๋ ๋์ ์๋ ์์ต๋๋ค.)
์ด์ ์ฌ์ฉ์ ์ ์ ์ค์ ์ฐ์ฐ์์ ๋ํ Haskell๊ณผ ๊ฐ์ ์ง์๋ง ์๋ค๋ฉด
6582 #6929 ์ถฉ๋ถํ์ง ์์ต๋๊น?
๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ด์ผ ํ๋ค: ... ์ฌ์ฉ์ ์ ์ _๋น์ ๋์ฝ๋_ ์ค์ ์ฐ์ฐ์, ์ฌ์ฉ์๊ฐ ์ด๋ฌํ ํต์ฌ ๊ธฐ๋ฅ์ ์ก์ธ์คํ๊ธฐ ์ํด ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ์
๋ ฅํ๋๋ก ์๊ตฌํ๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. $
๊ฐ ์ค์ ๋ก ์ถ๊ฐ๋ ๊ฒ ์ค ํ๋์ธ ๊ฒ์ ๋ณด์์ง๋ง ๊ฐ์ฌํฉ๋๋ค! ์์ฐ, ๊ทธ๋์ ์ด๊ฒ์ Julia _today_์์ ์ค์ ๋ก ์๋ํฉ๋๋ค(๋น๋ก "๋น ๋ฅด์ง๋" ์์ง๋ง... ์์ง):
julia> ($) = map
julia> sin $ (0.5 * (abs2 $ (x-y)))
map
์ ๋ํ ์ต์ ์ ์ ํ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง xor
$
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ๋ง ๋ญ๋น์ธ ๊ฒ ๊ฐ์ต๋๋ค. Bitwise xor๋ ๊ทธ๋ ๊ฒ ์์ฃผ ์ฌ์ฉ๋์ง ์์ต๋๋ค. map
๊ฐ ํจ์ฌ ๋ ์ค์ํฉ๋๋ค.
์์ @jiahao ์ ์์ ์ ๋งค์ฐ ์ข์ ์ ์
๋๋ค. exp
์ ๊ฐ์ ๊ฐ๋ณ ๋ฒกํฐํ๋ ํจ์๋ ์ค์ ๋ก exp(-x^2)
์ ๊ฐ์ ๋ฒกํฐํ๋ _ํํ์_์ ์ป๊ธฐ ์ํ ์ผ์ข
์ ํดํน์
๋๋ค. @devec
์ ๊ฐ์ ๊ตฌ๋ฌธ์ ๋งค์ฐ ์ ์ฉํ ๊ฒ์
๋๋ค. ์ฆ, ์ญ๋ฒกํฐํ๋ ์ฑ๋ฅ๊ณผ ํจ๊ป ๊ธฐ๋ฅ์ ๋ฒกํฐํ๋ ๊ฒ์ผ๋ก ๊ฐ๋ณ์ ์ผ๋ก ์๋ณํ ํ์๊ฐ ์๋ค๋ ์ผ๋ฐ์ฑ์ ์ป์ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํด ๊ธฐ๋ฅ ํน์ฑ์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ์ข๊ฒ ์ง๋ง ์ฌ์ ํ ๋ ๋ง์กฑ์ค๋ฝ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ค์ ๋ก ์ผ์ด๋๋ ์ผ์ ํ ์ฌ๋์ด ํจ์๋ฅผ ์์ฑํ๊ณ ๋ค๋ฅธ ์ฌ๋์ด ๊ทธ๊ฒ์ ๋ฐ๋ณตํ๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด ๊ธฐ๋ฅ์ ์์ฑ์ด ์๋๋ผ ๊ธฐ๋ฅ ์ฌ์ฉ์ ์์ฑ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ํน์ฑ ์ ์ฉ์ ๋ํ ๋ ผ์๋ ์๋ชป๋ ๋๋ฌด๋ฅผ ์ง๋ ๊ฒฝ์ฐ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ธ๋ ์ธ์คํ ๋ฐ: ๋ค์ค ์ธ์ ๋งคํ์ ์ง์ํ๋๋ก ๋งคํํ๋ ค๋ ์ธ์๋ฅผ ํ์ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
a = split("the quick brown")
b = split("fox deer bear")
c = split("jumped over the lazy")
d = split("dog cat")
e = string(a, " ", b., " ", c, " ", d.) # -> 3x2 Vector{String} of the combinations
# e[1,1]: """["the","quick", "brown"] fox ["jumped","over","the","lazy"] dog"""
.b
๋๋ b.
๊ฐ ๋งคํ๋๊ธฐ๋ฅผ ์ํ๋์ง ํ์ํ๋ ๊ฒ์ด ๋ ๋์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด ๊ฒฝ์ฐ map
ํ์ ๋ชจ์์ ๋ํ๋ด๋ฏ๋ก ๋ค์ฐจ์ 3x2 ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค.
๊ธ๋
https://github.com/eschnett/Vecmathlib.jl ์ ์ํ์ด ์๋ ๋ฆฌํฌ์งํ ๋ฆฌ์
๋๋ค.
exp
๊ตฌํ์ LLVM์์ ์ต์ ํํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์์ฑ๋์์ต๋๋ค.
์ด ๊ตฌํ์ ํ์ค exp
๋ณด๋ค ์ฝ 2๋ฐฐ ๋น ๋ฆ
๋๋ค.
๋ด ์์คํ
์ ๊ตฌํ. (์๋ง๋) ์์ง Yeppp์ ์๋์ ๋๋ฌํ์ง ๋ชปํ์ ๊ฒ์
๋๋ค.
์๋ง๋ LLVM์ด ๋ค์๊ณผ ๊ฐ์ด ํด๋น SIMD ๋ฃจํ๋ฅผ ํ์ง ์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์
๋๋ค.
Yeppp์ฒ๋ผ ๊ณต๊ฒฉ์ ์ผ๋ก. (๋ถํด๋ ์ค๋ช
์๋ฅผ ๋น๊ตํ์ต๋๋ค.)
๋ฒกํฐํ ๊ฐ๋ฅํ exp
ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฝ์ง ์์ต๋๋ค. ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
function kernel_vexp2{T}(ni::Int, nj::Int, x::Array{T,1}, y::Array{T,1})
for j in 1:nj
<strong i="16">@simd</strong> for i in 1:ni
<strong i="17">@inbounds</strong> y[i] += vexp2(x[i])
end
end
end
์ฌ๊ธฐ์ j
๋ฃจํ ๋ฐ ํจ์ ์ธ์๋
๋ฒค์น๋งํน ๋ชฉ์ .
Julia๋ฅผ ์ํ @unroll
๋งคํฌ๋ก๊ฐ ์์ต๋๊น?
-์๋ฆญ
2014๋ 11์ 2์ผ ์ผ์์ผ ์คํ 8์ 26๋ถ์ Tim Holy [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ํจ์์ ์์ฑ์ด ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๊ธฐ๋ฅ์ ์ฌ์ฉ. ํน์ฑ ์ ์ฉ์ ๋ํ ๋ ผ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๋ชป๋ ๋๋ฌด๋ฅผ ์ง๋ ๊ฒฝ์ฐ.์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/JuliaLang/julia/issues/8450#issuecomment -61433026.
์๋ฆญ ์ ๋คํฐ [email protected]
http://www.perimeterinstitute.ca/personal/eschnetter/
exp
์ ๊ฐ์ ๊ฐ๋ณ ๋ฒกํฐํ๋ ํจ์๋ ์ค์ ๋กexp(-x^2)
์ ๊ฐ์ ๋ฒกํฐํ๋ _ํํ์_์ ์ป๊ธฐ ์ํ ์ผ์ข ์ ํดํน์ ๋๋ค.
์ค์นผ๋ผ ์์ญ์์ ์ ์ฒด ํํ์์ ๋ค์ด์ฌ๋ฆฌ๊ธฐ ์ํ ํต์ฌ ๊ตฌ๋ฌธ์ ๋งค์ฐ ํฅ๋ฏธ๋ก์ธ ๊ฒ์
๋๋ค. ๋ฒกํฐํ๋ ํ ๊ฐ์ง ์์ ๋ถ๊ณผํฉ๋๋ค(๋์ ๋๋ฉ์ธ์ด ๋ฒกํฐ์ธ ๊ฒฝ์ฐ). ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ์ฌ์ฉ ์ฌ๋ก๋ ์๋ฏธ ์ฒด๊ณ๊ฐ ์๋นํ ๋ค๋ฅธ ๋งคํธ๋ฆญ์ค ๋๋ฉ์ธ(#5840)์ผ๋ก ๋ค์ด ์ฌ๋ฆฌ๋ ๊ฒ์
๋๋ค. ํ๋ ฌ ๋๋ฉ์ธ์์ ๋ค๋ฅธ ํํ์์ ๋ํ ๋์คํจ์น๊ฐ ์๋ํ๋ ๋ฐฉ์์ ํ์ํ๋ ๊ฒ๋ ์ ์ฉํ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ sqrtm
์ ๊ฐ์ ๋ ๋จ์ํ ๊ฒ์ ์ํ ๊ฒฝ์ฐ Schur-Parlett ๋ฐ ๊ธฐํ ๋ณด๋ค ์ ๋ฌธํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. (๊ทธ๋ฆฌ๊ณ ์๋ฆฌํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด *m
ํจ์๋ฅผ ์์ ํ ์ ๊ฑฐํ ์ ์์ต๋๋ค - expm
, logm
, sqrtm
, ...)
Julia์ ๋ํ
@unroll
๋งคํฌ๋ก๊ฐ ์์ต๋๊น?
Base.Cartesian ์ฌ์ฉ
@nexpr 4 d->(y[i+d] = exp(x[i+d])
(์ง๋ฌธ์ด ์๋ ๊ฒฝ์ฐ http://docs.julialang.org/en/latest/devdocs/cartesian/์ ์ฐธ์กฐํ์ญ์์ค.)
@jiahao ์ด๊ฒ์ ํ๋ ฌ ํจ์๋ก ์ผ๋ฐํํ๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ด ๋์ ์ฒ๋ผ ๋ค๋ฆฌ์ง๋ง ๊ทธ๊ฒ์ ๋ํ ๋ด ์ง์์ null์ ๊ฐ๊น์ต๋๋ค. ์๋ ๋ฐฉ์์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น? ๋ฒกํฐํ๋ก ์ด๋ป๊ฒ ํํ๋ ๊น์? ๊ตฌ๋ฌธ์ ํตํด ๋ฒกํฐ/ํ๋ ฌ์ ์์๋ณ๋ก exp
๋ฅผ ์ ์ฉํ๋ ๊ฒ๊ณผ ํ๋ ฌ ์ง์๋ฅผ ๊ณ์ฐํ๋ ๊ฒ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
@timholy : ๊ฐ์ฌํฉ๋๋ค! ์ธ๋กค๋ง์ ๋ฐ์นด๋ฅดํธ์์ ์ฌ์ฉํ ์๊ฐ์ ํ์ง ์์์ต๋๋ค.
๋ถํํ๋ @nexprs
(๋๋ ์๋ ์ธ๋กค๋ง)์ ์ํด ์์ฑ๋ ์ฝ๋๋ ๋ ์ด์ ๋ฒกํฐํ๋์ง ์์ต๋๋ค. (์ด๊ฒ์ LLVM 3.3์
๋๋ค. ์๋ง๋ LLVM 3.5๊ฐ ๋ ๋์ ๊ฒ์
๋๋ค.)
Re: unrolling, @toivoh ์ julia-users ๊ฒ์๋ฌผ ๋ ์ฐธ์กฐํ์ธ์. #6271์ ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
@nalimilan ๋๋ ์์ง ์ด๊ฒ์ ์๊ฐํ์ง ์์์ง๋ง ์ค์นผ๋ผ->ํ๋ ฌ ๋ฆฌํํ
์ ๋จ์ผ matrixfunc
ํจ์(๋งํ์๋ฉด)๋ก ๊ตฌํํ๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํ ๊ฒ์
๋๋ค. ํ๋์ ๊ฐ์ ๊ตฌ๋ฌธ(์์ ํ ๋ฌด์ธ๊ฐ๋ฅผ ๊ตฌ์ฑํ๋)์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
X = randn(10,10)
c = 0.7
lift(x->exp(c*x^2)*sin(x), X)
๊ทธ๋ฌ๋ฉด
Matrix{Float64}
์ด๊ณ ์์(์ ํ ๋งค๊ฐ๋ณ์) Float64
๊ฐ ์๋ X
์์ ์์น๋์ ์์ค ๋ฐ ๋์ ๋๋ฉ์ธ ์๋ณ(๋ฐ๋ผ์ Float64 => Matrix{Float64}
์์น๋๋ฅผ ์์์ ์ผ๋ก ์ ์) , ๊ทธ ๋ค์์matrixfunc(x->exp(c*x^2)*sin(x), X)
๋ฅผ ํธ์ถํ์ฌ expm(c*X^2)*sinm(X)
์ ํด๋นํ๋ ๊ฒ์ ๊ณ์ฐํ์ง๋ง ํ๋ ฌ ๊ณฑ์
์ ํผํฉ๋๋ค.์ผ๋ถ ๋ค๋ฅธ ์ฝ๋์์ X
๋ Vector{Int}
์ ์๊ณ ์์์ ๋ฆฌํํ
์ Int
์์ Vector{Int}
, ๊ทธ๋ฆฌ๊ณ lift(x->exp(c*x^2)*sin(x), X)
๊ฐ ๋ ์ ์์ต๋๋ค. ์ ํ map(x->exp(c*x^2)*sin(x), X)
.
์์ค ๋ฐ ๋์ ๋๋ฉ์ธ์ ๋ช
์์ ์ผ๋ก ์ง์ ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ(์: lift(Number=>Matrix, x->exp(c*x^2)*sin(x), X)
)๋ ์์ํ ์ ์์ต๋๋ค.
@nalimilan ๋ฒกํฐํ๋ ์ค์ ๋ก API์ ์์ฑ์ด ์๋๋๋ค. ์ค๋๋ ์ ์ปดํ์ผ๋ฌ ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด ํจ์๊ฐ ์ธ๋ผ์ธ์ธ ๊ฒฝ์ฐ์๋ง ๋ฒกํฐํํ ์ ์์ต๋๋ค. ์ํฉ์ ๋๋ถ๋ถ ํจ์ ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. "์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ"์ผ๋ก ์์ฑ๋๋ฉด ์ปดํ์ผ๋ฌ์์ ์ด๋ฅผ ๋ฒกํฐํํ ์ ์์ต๋๋ค(์ฃผ๋ณ ๋ฃจํ์ ์ธ๋ผ์ธํ ํ).
@eschnett : ๋ค๋ฅธ ๋ถ๋ค๊ณผ ๊ฐ์ ๋ฒกํฐํ ์๋ฏธ๋ฅผ ์ฌ์ฉํ๊ณ ๊ณ์ ๊ฐ์? @nalimilan ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ SIMD ๋ฑ์ ๊ดํ ๊ฒ ๊ฐ์ต๋๋ค.
์ค๋ฅธ์ชฝ. ๋ฒกํฐํ์๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ฐ๋
์ด ์์ต๋๋ค. ํ๋์ ๊ฑฐ๋
๊ธด๋ฐํ ๋ด๋ถ ๋ฃจํ(ํ๋ก์ธ์ ๋ฒกํฐํ)๋ฅผ ์ํด SIMD๋ฅผ ์ป์ต๋๋ค. ๋ฉ์ธ
์ฌ๊ธฐ์์ ๋
ผ์๋๋ ๋ฌธ์ ๋ ์ด๋ป๊ฒ ๋ "์๋์ผ๋ก"์ ๊ตฌ๋ฌธ/์๋ฏธ์
๋๋ค.
์ปฌ๋ ์
์์ ๋จ์ผ(๋๋ ๋ค์ค) ์ธ์ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
2014๋
11์ 4์ผ ํ์์ผ ์คํ 7์ 44๋ถ, John Myles White ์๋ฆผ @github.com
์ผ๋ค:
@eschnett https://github.com/eschnett : ๊ฐ์ ์๋ฏธ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ฐ์ ๋ฒกํฐํ? SIMD ๋ฑ์ ๊ดํ ๊ฒ ๊ฐ์ต๋๋ค.
@nalimilan https://github.com/nalimilan ์ ์ดํดํ๋ ๊ฒ์ด ์๋๋๋ค.
ํ๊ท .โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/JuliaLang/julia/issues/8450#issuecomment -61738237.
๋ค๋ฅธ .
์ฐ์ฐ์์ ๋์นญ์ผ๋ก f.(x)
ํจ์ ๋ชจ์์ ๊ฐ ๋ชจ์์ ์ ์ฉํ์ง ์์์ผ ํฉ๋๊น? (์๋ฅผ ๋ค์ด, ์ผ๋ถ ๋จ์ ์ขํ๊ณ์์ ๋ฌผ๋ฆฌ์ ์ขํ๋ก ๋ณํํ๋ ๊ฒฝ์ฐ.)
๊ตฌ๋ฌธ์ ๋
ผ์ํ๋ ๋์ ๋ช
์์ ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ map(log, x)
์ ํด๋นํ๋ ๊ฒ์ ํํํ๋ ๊ฒ์ด ๋๋ฌด ๋๋ฆฌ๋ค๋ ์๊ฐ์ด ๋ ์ฌ๋์ต๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ์ถฉ๋ถํ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์๋ค๋ฉด map
๋ฅผ ํธ์ถํ๊ฑฐ๋(๋๋ ํน์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ) ๋ฃจํ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋ฏธ ์์ค์์ ๋์ผํ๋ฉฐ ๊ตฌ๋ฌธ ๋ช
ํ์ฑ์ ๋์
ํ ํ์๊ฐ ์์ต๋๋ค. ํ์ฌ ๋ฒกํฐ ๋ก๊ทธ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋ฐฐ์ด์ ๋ฃจํ๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ์ฝ๋์์ ์ด๋ฌํ ๊ตฌ๋ถ์ ํํํ ๋ฐฉ๋ฒ์ ๋ฌป๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์๋ (1) ๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ ์ฒด๊ณ, (2) ๊ตฌํ์ด๋ผ๋ ๋ ๊ฐ์ง ์์ค์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ ๋ฌธ์ ๋ ์ฌ์ฉ์๊ฐ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์์๋ณ/๋ธ๋ก๋์บ์คํ
๋ฐฉ์์ผ๋ก ํน์ ๊ณ์ฐ์ ๋งคํํ๋ ค๋ ์๋๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ ๊ดํ ๊ฒ์
๋๋ค. ํ์ฌ Julia๋ ๋ฒกํฐํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์๊ฐ ๋ฃจํ๋ฅผ ๋ช
์์ ์ผ๋ก ์์ฑํ ์ ์๋๋ก ํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค(๋๋ก๋ ๋งคํฌ๋ก์ ๋์์ผ๋ก). ์ด๋ ์ชฝ๋ ์ด์์ ์ด์ง ์์ต๋๋ค. ๋ฒกํฐํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด exp(0.5 * (x - y).^2)
์ ๊ฐ์ ๋งค์ฐ ๊ฐ๊ฒฐํ ํํ์์ ์์ฑํ ์ ์์ง๋ง ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ฐ๋ฐ์ ์ธก์ ๋์๋ ๋
ผ์๊ณผ ์ฌ์ฉ์ ์ธก์ ํผ๋(ํน์ ๊ธฐ๋ฅ์ด ๋ฒกํฐํ๋์๋์ง ์ฌ๋ถ๋ฅผ ํ์
ํ๊ธฐ ์ํด ์ข
์ข
๋ฌธ์๋ฅผ ๊ฒ์ํด์ผ ํจ). (2) ๊ธฐ๋ฅ ๊ฒฝ๊ณ๋ฅผ ๋์ด ๋ฃจํ๋ฅผ ์ตํฉํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ด ์์ ์์ ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์์ผ๋ก ๋ช ๊ฐ์/๋ช ๋
์ด ์ง๋๋ฉด ์ปดํ์ผ๋ฌ๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ํจ๊ป ์ดํด๋ณด๊ณ , ๊ณต๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์๋ณํ๊ณ , ๊ธฐ๋ฅ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ต์ ํ๋ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ณต์กํ ์์
์ ์ํํ ์ ์์ ๊ฒ์
๋๋ค.
map
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๊ธฐ์ ๋ฌธ์ (1)์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฌ์ ํ โโ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค. (2) -- ํน์ ๋ฒกํฐํ๋ ํจ์ ๋๋ ์ผ๋ฐ map
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํญ์ ๋ฃจํ ์ตํฉ์ ๋ฐฉํดํ๋ ํจ์ ๊ฒฝ๊ณ๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ณ ์ฑ๋ฅ ๊ณ์ฐ์ ์ค์ํฉ๋๋ค. map ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ํ ์ฅํฉํ๊ฒ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ ํํ์์ ์ด์ map(exp, 0.5 * map(abs2, x - y))
์ ๊ฐ์ด ๋ ๊ธด ๋ฌธ์ฅ์ด ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ๋ ๋ณต์กํ ํํ์ผ๋ก ์
ํ๋ ๊ฒ์ด๋ผ๊ณ ํฉ๋ฆฌ์ ์ผ๋ก ์์ํ ์ ์์ต๋๋ค.
์ด ์ค๋ ๋์ ์์ฝ๋ ๋ชจ๋ ์ ์ ์ค์์ ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋งคํ์ ํ์ํ๊ธฐ ์ํด ํน์ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ผ๋ก ๊ฐ์ฅ ์ ๋งํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ์งธ, ํํ์ ๊ฐ๊ฒฐํจ์ ์ ์งํ๋ค. ์๋ฅผ ๋ค์ด $ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ์์ ํํ์์ ์ด์ exp $(0.5 * abs2$(x - y))
๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์๋์ ๋ฒกํฐํ๋ ํํ์๋ณด๋ค ์ฝ๊ฐ ๋ ๊ธธ์ง๋ง ๊ทธ๋ ๊ฒ ๋์์ง๋ ์์ต๋๋ค. ๋งคํ์ ๊ฐ ํธ์ถ์ $
๋ฅผ ์ฝ์
ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ค๋ฅธ ํํธ์ผ๋ก, ์ด ํ๊ธฐ๋ฒ์ ์ปดํ์ผ๋ฌ๊ฐ ํจ์ ๊ฒฝ๊ณ๋ฅผ ๊นจ๊ณ ์ตํฉ ๋ฃจํ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ํ ์ค์ธ ๋งคํ์ ๋ช
ํํ ํ์๊ธฐ ์ญํ ์ ํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์ปดํ์ผ๋ฌ๋ ํจ์์ ๋ด๋ถ ๊ตฌํ์ ๋ณผ ํ์๊ฐ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์์์ผ ํ ๊ฒ์ ํจ์๊ฐ ์ฃผ์ด์ง ๋ฐฐ์ด์ ๊ฐ ์์์ ๋งคํ๋๋ค๋ ๊ฒ๋ฟ์
๋๋ค.
์ต์ CPU์ ๋ชจ๋ ๊ธฐ๋ฅ, ํนํ SIMD์ ๊ธฐ๋ฅ์ ๊ฐ์ํ ๋ ์ฌ๋ฌ ๋ฃจํ๋ฅผ ํ๋๋ก ํตํฉํ๋ ๊ฒ์ ๊ณ ์ฑ๋ฅ ๊ณ์ฐ์ ํฅํ ํ ๋จ๊ณ์ผ ๋ฟ์
๋๋ค. ์ด ๋จ๊ณ ์์ฒด๋ SIMD ๋ช
๋ น์ด์ ํ์ฉ์ ํธ๋ฆฌ๊ฑฐํ์ง ์์ต๋๋ค. ์ข์ ์์์ ์ด์ @simd
๋งคํฌ๋ก๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ์ปดํ์ผ๋ฌ๋ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์์ ํ๊ณ ์ ์ตํ๋ค๊ณ ์๊ฐํ ๋ ์์ฑ๋ ๋ฃจํ์ ์์ ๋ถ๋ถ์ ์ด ๋งคํฌ๋ก๋ฅผ ์ฝ์
ํ ์ ์์ต๋๋ค.
์์ฝํ์๋ฉด, $ ํ๊ธฐ๋ฒ(๋๋ ์ ์ฌํ ์ ์)์ ๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ๋ก ๋ฌธ์ ๋ฅผ ํฌ๊ฒ ํด๊ฒฐํ ์ ์๋ ๋์์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฃจํ๋ฅผ ์ตํฉํ๊ณ SIMD๋ฅผ ํ์ฉํ์ฌ ๊ณ ์ฑ๋ฅ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@lindahua ์ ์์ฝ์ ์ข์ IMHO์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ ํ์ฅํ๋ ๊ฒ์ด ์ฌ๋ฏธ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Julia๋ ๋ง์ ๊ณตํต ํจํด์ ํ๋ฆฐ ๋ฃจํ๋งํผ ํจ์จ์ ์ผ๋ก ๋ง๋๋ ์ผ์ฌ ์ฐฌ ์์คํ ์ ๋ฐ์ ์๊ฒฉ์ด ์์ต๋๋ค.
A .* B .+ C
๊ฐ ๋ ๊ฐ์ ์์ ์์ฑ์ผ๋ก ์ด์ด์ง์ง ์๊ณ ๊ฒฐ๊ณผ์ ๋ํด ํ๋๋ง ์์ฑ๋๋๋ก ํด์ผ ํฉ๋๋ค.sumabs2(A)
๋ฅผ ์ ๊ฑฐํ๊ณ sum(abs$(A)$^2)
(๋๋ sum(abs.(A).^2)
)์ ๊ฐ์ ํ์ค ํ๊ธฐ๋ฒ์ผ๋ก ๋์ฒดํ ์ ์์ต๋๋ค.A .* B
๋ 0์ด ์๋ ํญ๋ชฉ๋ง ์ฒ๋ฆฌํ๊ณ ํฌ์ ํ๋ ฌ์ ๋ฐํํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ์์๋ณ ํจ์๋ฅผ Set
, Dict
๋๋ Range
์ ์ ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์๋ ์ ์ฉํฉ๋๋ค.๋ง์ง๋ง ๋ ์ง์ ์ ์์๋ณ ํจ์๊ฐ ํน๋ณํ AbstractArray
LazyArray
์ ๋ฐํํ๋๋ก ํ์ฌ ์๋ํ ์ ์์ต๋๋ค Transpose
https://github.com/JuliaLang/julia/issues/4774#issuecomment-59422003์์ ์
๋ ฅ). ๊ทธ๋ฌ๋ 1
์์ length(A)
๊น์ง ์ ํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์งํ๊ฒ ์์์ ์ก์ธ์คํ๋ ๋์ ๋ฐ๋ณต์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฃผ์ด์ง ์ ํ์ ๋ฐ๋ณต์๋ ์ ํ์ ์ ์ฅ์ ๋ ์ด์์์ ๋ฐ๋ผ ํ ๋จ์ ๋๋ ์ด ๋จ์ ๋ฐ๋ณต์ด ๊ฐ์ฅ ํจ์จ์ ์ธ์ง ์ฌ๋ถ๋ฅผ ์๋์ผ๋ก ์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํฌ์ ํ๋ ฌ์ ๊ฒฝ์ฐ 0 ํญ๋ชฉ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค(์๋ณธ๊ณผ ๊ฒฐ๊ณผ๋ ๊ณตํต โโ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค. https://github.com/JuliaLang/julia/issues/7010, https://github. com/JuliaLang/julia/issues/7157).
์ถ์๊ฐ ์ ์ฉ๋์ง ์์ผ๋ฉด ์๋์ ๊ฒ๊ณผ ๊ฐ์ ์ ํ ๋ฐ ๋ชจ์์ ๊ฐ์ฒด๋ LazyArray
( collect
์ ๋์ผํ์ง๋ง ์๋ ๋ฐฐ์ด์ ์ ํ์ ์กด์คํจ)๋ฅผ ๋ฐ๋ณตํ์ฌ ์ฑ์์ง๋๋ค. ). ์ด๋ฅผ ์ํด ํ์ํ ์ ์ผํ ๊ฒ์ ๋ฐ๋ณต์๊ฐ LazyArray
getindex
๋ฅผ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ์ ๋ํด setindex!
๋ฅผ ํธ์ถํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์
๋๋ค(์: ์ ํ ๋๋ ๋ฐ์นด๋ฅดํธ ์ขํ).
์ถ์๊ฐ ์ ์ฉ๋๋ฉด ์ธ์์ ๊ด๋ จ ๋ฐ๋ณต ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ LazyArray
์ ํ์ ์ฐจ์์ ๋ฐ๋ณตํ๊ณ ๊ฒฐ๊ณผ๋ก ๋ฐฐ์ด์ ์ฑ์๋๋ค( reduce
์ ๋์ผํ์ง๋ง ๋ฐฐ์ด ์ ํ์ ์ ์ํ๊ธฐ ์ํ ์ฌ์ฉ์ ์ ์ ๋ฐ๋ณต์). ํ๋์ ํจ์(๋ง์ง๋ง ๋จ๋ฝ์์ ์ฌ์ฉ๋ ํจ์)๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋ ์์์ ๋ํด ๋ฐ๋ณต๊ธฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ํน์ ์ฐจ์์์ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค.
์ด ์ ์ฒด ์์คํ ์ ๋ด๋ถ ์์ ๋ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ์ง์ํฉ๋๋ค.
๋๋ ๊ตฌ๋ฌธ์ ๋ค๋ฃจ๋ ๊ฒ์ ๋ํด ์กฐ๊ธ ์๊ฐํ๊ณ ๋ฐฐ์ด์ ์์๋ณ ์ฐ์ฐ์ ์ ์ฉํ๊ธฐ ์ํด .=
๋ฅผ ์๊ฐํ์ต๋๋ค.
๋ฐ๋ผ์ @nalimilan ์ sum(abs.(A).^2))
์์ ๋ ๋ถํํ๋ ๋ ๋จ๊ณ๋ก ์์ฑ๋์ด์ผ ํฉ๋๋ค.
A = [1,2,3,4]
a .= abs(A)^2
result = sum(a)
์ด๊ฒ์ ์ฝ๊ธฐ ์ฝ๋ค๋ ์ด์ ์ด ์์ผ๋ฉฐ ์์๋ณ ํจ์๋ ๋ฐฐ์ด ํน์ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๋์ ๋จ์ผ(๋๋ ๋ค์ค) ์ ๋ ฅ์ ๋ํด์๋ง ์์ฑ๋๊ณ ํด๋น ๊ฒฝ์ฐ์ ์ต์ ํ๋์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
๋ฌผ๋ก ์ฑ๋ฅ๊ณผ ์น์ํจ ์ธ์๋ ์ธ๊ธ๋ ๋๋ก ์ง๊ธ ๋น์ฅ map((x) -> abs(x)^2, A)
๋ฅผ ์ฐ๋ ๊ฒ์ ๋ง์ง ๋ชปํฉ๋๋ค.
๋๋ .()
๋ก ๋งคํํ ํํ์์ ๋๋ฌ์ธ๋ฉด ์๋ํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ด์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง .sin(x)
๋ฐ .(x + sin(x))
๋ ๊ดํธ ์์ ํํ์์ด๋ .
๋ค์ ์ค๋ ํจ์๋ฅผ ๋งคํํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด sum(.(abs(A)^2))
๋ฅผ ํ ์ค๋ก ์์ฑํ ์ ์๋ @nalimilan ์ ์์ ๊ฐ์ ์ถ์๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ ์ ์์ ๋ชจ๋ ๋ด๋ถ์ ์ผ๋ก ๋ธ๋ก๋์บ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๋์ ๋ฐฐ์ด์ ๋ํ ์์๋ณ ์ฐ์ฐ์ ์๊ฐํ๊ฒ ๋ง๋ .
์ ๋์ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ $
๋๋ ๋ค๋ฅธ ๊ธฐํธ๋ก ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋งคํํ ๋ชจ๋ ํจ์ ์ฃผ์์ ๋งต ์ฐ์ฐ์๋ฅผ ๋ฐฐ์นํ๊ณ ๋์ ์ ์ฒด ํํ์์ ๊ทธ๋ฃนํํ๊ณ ๋งคํ๋๋๋ก ์ง์ ํ๋ ๊ฒ์ ๋์์ผ ๋ฟ์
๋๋ค.
๋๋ ๋์ ๋ง์ง๋ง ์ฝ๋ฉํธ์ ๋
ธ์ถ๋ LazyArray
์์ด๋์ด๋ฅผ ์คํํ์ต๋๋ค: https://gist.github.com/nalimilan/e737bc8b3b10288abdad
์ด ๊ฐ๋
์ฆ๋ช
์๋ ๊ตฌ๋ฌธ์์ ์คํ์ด ์์ง๋ง (a ./ 2).^2
๋ ์์ง์์ LazyArray(LazyArray(a, /, (2,)), ^, (2,))
๋ก ์์ฑ๋ ๊ฒ์ผ๋ก ๋ฒ์ญ๋ฉ๋๋ค. ์์คํ
์ ๊ฝค ์ ์๋ํ์ง๋ง ์ฑ๋ฅ๊ณผ ๊ด๋ จํ์ฌ ๋ฃจํ์ ์๊ฒฉ์ผ๋ก ๊ฒฝ์ํ๋ ค๋ฉด ๋ ๋ง์ ์ต์ ํ๊ฐ ํ์ํฉ๋๋ค. (์์๋๋) ๋ฌธ์ ๋ ์ถ๊ฐ ์ธ์๊ฐ ํ์ฉ๋์ง ์๋ ๋ฒ์ ์์๋ 12ํ์ ํจ์ ํธ์ถ์ด ์ต์ ํ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค(๊ฑฐ์ ๋ชจ๋ ํ ๋น์ด ๊ฑฐ๊ธฐ์์ ๋ฐ์ํจ). ํธ์ถํ๋ ํจ์์์ LazyArray
๋ฅผ ๋งค๊ฐ๋ณ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ธ์ ์ฒ๋ฆฌ๋ ๊ณ ์ฌํ๊ณ ์ด๋ป๊ฒ ๊ทธ๋ ๊ฒ ํ ์ ์๋์ง ์์ง ๋ชปํ์ต๋๋ค. ์ด๋ค ์์ด๋์ด?
LazyArray
์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์ ์ฌํญ์ด ์์ต๋๊น?
@nalimilan ๋๋ 1๋ ์ ์ NumericFuns์ functor ์ ํ์ ์ฌ์ฉํ์ฌ ๊ฒ์ผ๋ฅธ ํํ์ ์ ํ์ ๋งค๊ฐ๋ณ์ํํ๋ ์ ์ฌํ ์ ๊ทผ ๋ฐฉ์์ ์คํํ์ต๋๋ค. ๋ค์ํ ํธ๋ฆญ์ ์๋ํ์ง๋ง ์ฑ๋ฅ ๊ฒฉ์ฐจ๋ฅผ ๋ฉ์ฐ๋ ๋ฐ ์ด์ด ์์์ต๋๋ค.
์ปดํ์ผ๋ฌ ์ต์ ํ๋ ์ง๋ 1๋
๋์ ์ ์ง์ ์ผ๋ก ๊ฐ์ ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ๋ถํ์ํ ์ค๋ฒํค๋๋ฅผ ์ต์ ํํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฐ ์ข
๋ฅ์ ์ผ์๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ณต๊ฒฉ์ ์ธ ์ธ๋ผ์ธ ํจ์๋ฅผ ํ์๋ก ํฉ๋๋ค. @inline
๋ฅผ ์ฌ์ฉํด ๋ณด๊ณ ์ํฉ์ด ๊ฐ์ ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
@lindahua @inline
๋ ํ์ด๋ฐ์ ์ฐจ์ด๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค getindex(::LazyArray, ...)
๋ ์ฃผ์ด์ง LazyArray
์๋ช
์ ํนํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋
ผ๋ฆฌ์ ์
๋๋ค. ์ด ์๋ช
์ ์ด๋ค ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํ๋์ง ์ง์ ํ์ง ์์ต๋๋ค. ๋ถ๋ฆฌ๋ค. getindex
์ปดํ์ผํ ๋ ํธ์ถ์ ์ ์ ์๋๋ก ํธ์ถํด์ผ ํ๋ F ํจ์์ ํจ๊ป LazyArray{T1, N, T2, F}
์ ๊ฐ์ ๊ฒ์ด ํ์ํฉ๋๋ค. ๋ฐฉ๋ฒ์ด ์๋์?
์ธ๋ผ์ธ์ ๋ ๋ค๋ฅธ ํฐ ๊ฐ์ ์ฌํญ์ด์ง๋ง ํ์ฌ๋ก์๋ ์ธ๋ผ์ธ๋์ง ์์ ํธ์ถ๋ณด๋ค ํ์ด๋ฐ์ด ํจ์ฌ ๋ ๋์ฉ๋๋ค.
NumericFuns
์ฌ์ฉ์ ๊ณ ๋ คํ ์ ์์ผ๋ฉฐ F
๋ ํํฐ ์ ํ์ด ๋ ์ ์์ต๋๋ค.
๋คํ
๋ถ์ฐ์ ๋ํ ๋ฐํ ์ ํ์ ์๊ณ ์๋ ํจ์๊ฐ ํ์ํ์ต๋๋ค.
์ปดํจํ
, ์ฌ๊ธฐ์ ๊ฒฐ๊ณผ ์ด์ ์ ๊ฒฐ๊ณผ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์์ฑํฉ๋๋ค(๋ฐ
๋ฐ๋ผ์ ๊ทธ ์ ํ)์ด ์๋ ค์ ธ ์์ต๋๋ค. ๋๋ ๋งค์ฐ ์ ์ฌํ ๊ฒ์ ์ง์ ๊ตฌํํ์ผ๋ฉฐ
์๋ง๋ "Functors"๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ์ฌ์ฉํ๋๋ก ์ ํํด์ผ ํฉ๋๋ค. (์ซ์ด.
"functor"๋ผ๋ ์ด๋ฆ์ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒ์ด๋ฏ๋ก <
http://en.wikipedia.org/wiki/Functor>, ํ์ง๋ง C++์ด ๋ฌผ์ ํํธ๋ฌ๋จ๋ฆฐ ๊ฒ ๊ฐ์์.
์ฌ๊ธฐ.)
Functor ๋ถ๋ถ์
์ํ ํจ์.
-์๋ฆญ
2014๋
11์ 20์ผ ๋ชฉ์์ผ ์ค์ 10์ 35๋ถ, Dahua Lin [email protected]
์ผ๋ค:
NumericFuns ์ฌ์ฉ์ ๊ณ ๋ คํ ์ ์์ผ๋ฉฐ F๋ ํํฐ ์ ํ์ผ ์ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/JuliaLang/julia/issues/8450#issuecomment -63826019.
์๋ฆญ ์ ๋คํฐ [email protected]
http://www.perimeterinstitute.ca/personal/eschnetter/
@lindahua ๋๋ functor๋ฅผ ์ฌ์ฉํด ๋ณด์๊ณ ์ค์ ๋ก ์ฑ๋ฅ์ด ํจ์ฌ ๋ ํฉ๋ฆฌ์ ์
๋๋ค.
https://gist.github.com/nalimilan/d345e1c080984ed4c89a
With functions:
# elapsed time: 3.235718017 seconds (1192272000 bytes allocated, 32.20% gc time)
With functors:
# elapsed time: 0.220926698 seconds (80406656 bytes allocated, 26.89% gc time)
Loop:
# elapsed time: 0.07613788 seconds (80187556 bytes allocated, 45.31% gc time)
์์ฑ๋ ์ฝ๋๊ฐ ์์ง ์ต์ ์ ์ํ๊ฐ ์๋ ๊ฒ ๊ฐ์์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฌด์์ ๋ ํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ฌด์์ด ์๋ชป๋๋์ง ์๊ธฐ ์ํด์๋ ๋ ์ ๋ฌธ๊ฐ์ ๋์ด ํ์ํฉ๋๋ค.
์ค์ ๋ก ์์ ํ
์คํธ๋ Pow
๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ๋ช
์์ ๋ฃจํ๋ฅผ ์์ฑํ๋์ง ์๋๋ฉด LazyArray
๋ฅผ ์ฌ์ฉํ๋์ง์ ๋ฐ๋ผ ๋ถ๋ช
ํ ํฐ ์๋ ์ฐจ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ํ์์ ๊ฒฝ์ฐ์๋ง ์ํ๋๋ ์ง์นจ์ ์ตํฉ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ ํ์์ ์๋ฅผ ๋ค์ด ์ถ๊ฐ๋ก ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด 100x100 ๋๋ 1000x1000 ํ๋ ฌ์์ ์ฐจ์ด๊ฐ ํจ์ฌ ์์ต๋๋ค. ์๋ง๋ ์ธ๋ถ์ ์๊ณ ๋ฐ๋ผ์ ์ธ๋ผ์ธ์ผ๋ก ๋ง์ ์ด๋์ ์ป์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค.
# With sqrt()
julia> test_lazy!(newa, a);
julia> <strong i="8">@time</strong> for i in 1:1000 test_lazy!(newa, a) end
elapsed time: 0.151761874 seconds (232000 bytes allocated)
julia> test_loop_dense!(newa, a);
julia> <strong i="9">@time</strong> for i in 1:1000 test_loop_dense!(newa, a) end
elapsed time: 0.121304952 seconds (0 bytes allocated)
# With exp()
julia> test_lazy!(newa, a);
julia> <strong i="10">@time</strong> for i in 1:1000 test_lazy!(newa, a) end
elapsed time: 0.289050295 seconds (232000 bytes allocated)
julia> test_loop_dense!(newa, a);
julia> <strong i="11">@time</strong> for i in 1:1000 test_loop_dense!(newa, a) end
elapsed time: 0.191016958 seconds (0 bytes allocated)
๊ทธ๋์ LazyArray
์์ ์ต์ ํ๊ฐ ์ผ์ด๋์ง ์๋ ์ด์ ๋ฅผ ์๊ณ ์ถ์ต๋๋ค. ์์ฑ๋ ์ด์
๋ธ๋ฆฌ๋ ๊ฐ๋จํ ์์
์ ๋นํด ์๋นํ ๊น๋๋ค. ์๋ฅผ ๋ค์ด x/2 + 3
์ ๊ฒฝ์ฐ:
julia> a1 = LazyArray(a, Divide(), (2.0,));
julia> a2 = LazyArray(a1, Add(), (3.0,));
julia> <strong i="17">@code_native</strong> a2[1]
.text
Filename: none
Source line: 1
push RBP
mov RBP, RSP
Source line: 1
mov RAX, QWORD PTR [RDI + 8]
mov RCX, QWORD PTR [RAX + 8]
lea RDX, QWORD PTR [RSI - 1]
cmp RDX, QWORD PTR [RCX + 16]
jae L64
mov RCX, QWORD PTR [RCX + 8]
movsd XMM0, QWORD PTR [RCX + 8*RSI - 8]
mov RAX, QWORD PTR [RAX + 24]
mov RAX, QWORD PTR [RAX + 16]
divsd XMM0, QWORD PTR [RAX + 8]
mov RAX, QWORD PTR [RDI + 24]
mov RAX, QWORD PTR [RAX + 16]
addsd XMM0, QWORD PTR [RAX + 8]
pop RBP
ret
L64: movabs RAX, jl_bounds_exception
mov RDI, QWORD PTR [RAX]
movabs RAX, jl_throw_with_superfluous_argument
mov ESI, 1
call RAX
์ด์ ์์ํ๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก:
julia> fun(x) = x/2.0 + 3.0
fun (generic function with 1 method)
julia> <strong i="21">@code_native</strong> fun(a1[1])
.text
Filename: none
Source line: 1
push RBP
mov RBP, RSP
movabs RAX, 139856006157040
Source line: 1
mulsd XMM0, QWORD PTR [RAX]
movabs RAX, 139856006157048
addsd XMM0, QWORD PTR [RAX]
pop RBP
ret
jae L64
๊น์ง์ ๋ถ๋ถ์ ๋ฐฐ์ด ๊ฒฝ๊ณ ๊ฒ์ฌ์
๋๋ค. @inbounds
๋ฅผ ์ฌ์ฉํ๋ฉด ๋์์ด ๋ ์ ์์ต๋๋ค(ํด๋น๋๋ ๊ฒฝ์ฐ).
๋ ๊ฐ์ ์ฐ์ ํ์ด mov RAX, ...
๋ก ์์ํ๋ ์๋ ๋ถ๋ถ์ ์ด์ค ๊ฐ์ ์ฐธ์กฐ์
๋๋ค. ์ฆ, ํฌ์ธํฐ์ ๋ํ ํฌ์ธํฐ(๋๋ ๋ฐฐ์ด์ ๋ฐฐ์ด ๋๋ ๋ฐฐ์ด์ ๋ํ ํฌ์ธํฐ ๋ฑ)์ ์ก์ธ์คํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ LazyArray์ ๋ด๋ถ ํํ๊ณผ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค. ์๋ง๋ immutable์ ์ฌ์ฉํ๋ ๊ฒ(๋๋ Julia์ ์ํด immutable์ ๋ค๋ฅด๊ฒ ํํํ๋ ๊ฒ)์ด ๋์์ด ๋ ๊ฒ์
๋๋ค.
์ด์จ๋ ์ฝ๋๋ ์ฌ์ ํ ๋งค์ฐ ๋น ๋ฆ ๋๋ค. ๋ ๋น ๋ฅด๊ฒ ๋ง๋ค๋ ค๋ฉด ํธ์ถ์์ ์ธ๋ผ์ธ๋์ด ์ถ๊ฐ ์ต์ ํ ๊ธฐํ๋ฅผ ๋ ธ์ถํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฃจํ์์ ์ด ํํ์์ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
๋ํ: REPL์ด ์๋๋ผ ํจ์ ๋ด์์ ์ด๊ฒ์ ๋์ค์ด์ ๋ธํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
๋ํ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ด ์ค์
๋ ๋ฒ์งธ๋ x/2๋ฅผ ๊ณฑ์
์ผ๋ก ๋ณํํ์ต๋๋ค.
๋๊ธ ๊ฐ์ฌํฉ๋๋ค.
@eschnett LazyArray
๋ ์ด๋ฏธ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ๋ฃจํ์์ @inbounds
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. https://gist.github.com/nalimilan/d345e1c080984ed4c89a ์์ ์์ ์ ์คํํ ํ ๋ค์์ ์ฌ์ฉํ์ฌ ๋ฃจํ์์ ์ ๊ณตํ๋ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
function test_lazy!(newa, a)
a1 = LazyArray(a, Divide(), (2.0,))
a2 = LazyArray(a1, Add(), (3.0,))
collect!(newa, a2)
newa
end
<strong i="11">@code_native</strong> test_lazy!(newa, a);
๊ทธ๋์ ๋ด๊ฐ ํ์ํ ๊ฒ์ ๊ฐ์ ๋ก ์ธ๋ผ์ธํ ์ ์๋ ๊ฒ๋ฟ์ผ๊น์? ๋ด ์๋์์ @inline
๋ฅผ getindex
์ ์ถ๊ฐํด๋ ํ์ด๋ฐ์ด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
@toivoh ํ์์ ๊ฒฝ์ฐ ๋ถํ ์ด ๋จ์ํ๋์ง ์๋๋ค๋ ๊ฒ์ ๋ฌด์์ผ๋ก ์ค๋ช ํ ์ ์์ต๋๊น?
๋ ๊ฐ์ ์ธ์ ๋ฒ์ ( LazyArray2
์ด๋ผ๊ณ ํจ)์ผ๋ก ๊ณ์ ์คํํ์ต๋๋ค. x .+ y
์ ๊ฐ์ ๊ฐ๋จํ ์์
์ ๊ฒฝ์ฐ ์ค์ ๋ก ํ์ฌ .+
LazyArray2
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋น ๋ฅด๋ฉฐ ๋ช
์์ ๋ฃจํ์ ๋งค์ฐ ๊ฐ๊น์ต๋๋ค(1000๊ฐ ํธ์ถ์ ๋ํ ๊ฒ์
๋๋ค). , https://gist.github.com/nalimilan/d345e1c080984ed4c89a ์ฐธ์กฐ):
# With LazyArray2, filling existing array
elapsed time: 0.028212517 seconds (56000 bytes allocated)
# With explicit loop, filling existing array
elapsed time: 0.013500379 seconds (0 bytes allocated)
# With LazyArray2, allocating a new array before filling it
elapsed time: 0.098324278 seconds (80104000 bytes allocated, 74.16% gc time)
# Using .+ (thus allocating a new array)
elapsed time: 0.078337337 seconds (80712000 bytes allocated, 52.46% gc time)
๋ฐ๋ผ์ ์ด ์ ๋ต์ .+
, .*
๋ฑ์ ์ฐ์ฐ์๋ฅผ ํฌํจํ ๋ชจ๋ ์์๋ณ ์ฐ์ฐ์ ๋์ฒดํ๋ ๋ฐ ์คํ ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
๋ํ ํ๋ ฌ์ ์ฐจ์, ์ฆ sum((x .- y).^2, 1)
(์์ ์ ๋ค์ ์ฐธ์กฐ)๋ฅผ ๋ฐ๋ผ ์ฐจ์ด ์ ๊ณฑ์ ํฉ์ ๊ณ์ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์์
์ ์ํํ๋ ๊ฒ์ด ๋งค์ฐ ๊ฒฝ์๋ ฅ์ด ์์ด ๋ณด์
๋๋ค.
# With LazyArray2 and LazyArray (no array allocated except the result)
elapsed time: 0.022895754 seconds (1272000 bytes allocated)
# With explicit loop (no array allocated except the result)
elapsed time: 0.020376307 seconds (896000 bytes allocated)
# With element-wise operators (temporary copies allocated)
elapsed time: 0.331359085 seconds (160872000 bytes allocated, 50.20% gc time)
@nalimilan
LazyArrays์ ๋ํ ์ ๊ทผ ๋ฐฉ์์ Haskell์ด ์๋ํ๋ ์ฆ๊ธฐ ์ตํฉ ๋ฐฉ์๊ณผ ์ ์ฌํ ๊ฒ ๊ฐ์ต๋๋ค[1, 2]. ๊ทธ ๋ถ์ผ์ ์์ด๋์ด๋ฅผ ์ ์ฉํ ์ ์์๊น์?
[1] http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.104.7401
[2] http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.421.8551
@vchuravy ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ ์ค์ ๋ก ์ ์ฌํ์ง๋ง Julia๊ฐ ๋ช ๋ นํ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ ๋ณต์กํฉ๋๋ค. ๋ฐ๋๋ก Haskell์์๋ ์ปดํ์ผ๋ฌ๊ฐ ๋งค์ฐ ๋ค์ํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๊ณ SIMD ๋ฌธ์ ๋ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค(์ด๋ Julia์ ๋์ค ์์ ์์ LLVM์ ์ํด ์ฒ๋ฆฌ๋จ). ํ์ง๋ง ์์งํ ์ด ๋ ผ๋ฌธ์ ๋ชจ๋ ๊ฒ์ ๋ถ์ํ ์๋ ์์ต๋๋ค.
@nalimilan ๊ทธ ๋๋ ์ ์๋๋ค. ๋ ๋ฒ์งธ ๋ ผ๋ฌธ์ด ํนํ ํฅ๋ฏธ๋ก์ด ์ด์ ๋ ์ผ๋ฐํ๋ ์คํธ๋ฆผ ํจ์ (Generalized Stream Fusion)์ ๋ํด ๋ ผ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ๋ฒกํฐ์ ๋ํ ๋ฉ์ง ๊ณ์ฐ ๋ชจ๋ธ์ ๋ถ๋ช ํ ํ์ฉํฉ๋๋ค.
map
๋ฐ reduce
์ ๊ฐ์ ๊ตฌ์ฑ์ด ๊ฒ์ผ๋ฆ๊ณผ ํจ๊ป ์ถฉ๋ถํ ๋น ๋ฅผ ์ ์๋ค๋(๋๋ ๋ช
์์ ๋ฃจํ๋ณด๋ค ๋น ๋ฅผ ์ ์์) ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ทจํด์ผ ํ๋ ์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ๋งํ ์ ์๋ ํ, ์ค๊ดํธ๋ ์ฌ์ ํ ํธ์ถ ๊ตฌ๋ฌธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด func{x}
๊ฐ ๋๋ค๋ฉด? ์ด์ฉ๋ฉด ์กฐ๊ธ ๋๋ฌด ๋ญ๋น?
๋น ๋ฅธ ๋ฒกํฐ๋ง(SIMD์ ์๋ฏธ์์) ์ฃผ์ ์ ๋ํด Eigen์ด ์ํํ๋ ๋ฐฉ์์ ๋ชจ๋ฐฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋ค์์ ํ์ฌ์ ๋ชจ๋ ์์๋ณ ์ฐ์ฐ์ ์์์ LazyArray
๋ฐ LazyArray2
๋ผ๊ณ ํ๋ ์ผ๋ฐํ๋ก ๋์ฒดํ๋ ์ ์์
๋๋ค. ์ด๊ฒ์ ๋ฌผ๋ก NumericFuns.jl์ ํํฐ์ ์์กดํ์ง ์๊ณ ๋ชจ๋ ํจ์์ ๋ํด ์ด๊ฒ์ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์๋ค๋ ๊ฐ์ ์ ์์กดํฉ๋๋ค.
1) $ x
f()
$๋ฅผ ํธ์ถํ๋ LazyArray
๋ฅผ ์์ฑํ๋ ์๋ก์ด ๊ตฌ๋ฌธ f.(x)
๋๋ f$(x)
๋๋ ๋ฌด์์ด๋ ์ถ๊ฐํฉ๋๋ค.
2) broadcast
๊ฐ ํ์ฌ ์๋ํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ์ด ๊ตฌ๋ฌธ์ ์ผ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด f.(x, y, ...)
๋๋ f$(x, y, ...)
๋ LazyArray
๋ฅผ ์์ฑํ์ง๋ง ํ์ฅ ์ฑ๊ธํค ์ฐจ์์ x
์
๋๋ค. y
, ... ๊ณตํต ํฌ๊ธฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๊ฒ์ ๋ฌผ๋ก ์ธ๋ฑ์ค์ ๋ํ ๊ณ์ฐ์ ์ํด ์ฆ์์์ ์ํ๋์ด ํ์ฅ๋ ๋ฐฐ์ด์ด ์ค์ ๋ก ํ ๋น๋์ง ์์ต๋๋ค.
3) .+
, .-
, .*
, ./
, .^
๋ฑ์ $ ๋์ broadcast
LazyArray
์ฌ์ฉ broadcast
.
4) ์๋ก์ด ๋์
์ฐ์ฐ์ .=
๋๋ $=
๋ฅผ ๋์
ํ์ฌ collect
ํธ์ถ) LazyArray
๋ฅผ ์ค์ ๋ฐฐ์ด๋ก ๋ณํํฉ๋๋ค. ์น๊ฒฉ ๊ท์น์ ํตํ ์
๋ ฅ ๋ฐ ์
๋ ฅ์ ์์ ์ ํ ๋ฐ ํธ์ถ๋ ํจ์์ ๋ฐ๋ฅธ ์์ ์ ํ).
5) broadcast
๋ฅผ LazyArray
ํธ์ถ๋ก ๋ฐ๊พธ๊ณ ๊ฒฐ๊ณผ์ ์ฆ๊ฐ์ ์ธ collect
์ด์จ์ ์ค์ ๋ฐฐ์ด๋ก ๋ฐ๊ฟ ์๋ ์์ต๋๋ค.
ํฌ์ธํธ 4๋ ํต์ฌ ์ฌํญ์
๋๋ค. ์์๋ณ ์์
์ ์ค์ ๋ฐฐ์ด์ ๋ฐํํ์ง ์๊ณ ํญ์ LazyArray
์ด๋ฏ๋ก ์ฌ๋ฌ ์์
์ ๊ฒฐํฉํ ๋ ๋ณต์ฌ๋ณธ์ด ๋ง๋ค์ด์ง์ง ์๊ณ ๋ฃจํ๊ฐ ํจ์จ์ฑ์ ์ํด ์ตํฉ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์์๋ฅผ ํ ๋นํ์ง ์๊ณ ๊ฒฐ๊ณผ์ sum
์ ๊ฐ์ ํธ์ถ ๊ฐ์๋ฅผ ํ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์ข
๋ฅ์ ํํ์์ ์กฐ๋ฐํ ๋ฐฐ์ด๊ณผ ํฌ์ ํ๋ ฌ ๋ชจ๋์ ๋ํด ๊ด์ฉ์ ์ด๊ณ ํจ์จ์ ์
๋๋ค.
y .= sqrt.(x .+ 2)
y .= โฯ exp.(-x .^ 2) .* sin.(k .* x) .+ im * log.(x .- 1)
sum((x .- y).^2, 1)
๋๋ ์ด๋ฐ ์ข
๋ฅ์ ๊ฒฝ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์ด๋ ์ด ๋ทฐ์ Transpose
/ CTranspose
์ ์๋ก์ด ๊ทธ๋ฆผ์ ์๋ฒฝํ๊ฒ ๋ค์ด๋ง๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ Julia์์ ์กฐ๋ฐํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ๊ตฌ๋ฌธ์ผ๋ก ๋ณต์กํ ์์
์ ๋งค์ฐ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ๊ฒฝ์ฐ์๋ "์์ฌ ๋ฐฐ์ด"์ ๋
๋ฆฝ์ ์ผ๋ก ๋ง๋ค์ด์ผ ํ ๋ copy
๋ฅผ ๋ช
์์ ์ผ๋ก ํธ์ถํด์ผ ํฉ๋๋ค. ๊ธฐ๋ฐ์ด ๋๋ ์ค์ ๋ฐฐ์ด์
๋๋ค.
์ด๊ฒ์ ์ ๋ง ์ค์ํ ๊ธฐ๋ฅ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์์๋ณ ์ฐ์ฐ์์ ํ์ฌ ๋์์ ์๋ก์ด ์ฌ์ฉ์์๊ฒ ํจ์ ์
๋๋ค. ๊ตฌ๋ฌธ์ ํ๋ฅญํ๊ณ ์งง์ง๋ง ์ฑ๋ฅ์ ์ผ๋ฐ์ ์ผ๋ก Matlab๋ณด๋ค ํจ์ฌ ๋์ฉ๋๋ค. ์ง๋ ์ฃผ์ julia-users์ ์ฌ๋ฌ ์ค๋ ๋์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์๋๋ฐ ์ด๋ฌํ ๋์์ธ์ผ๋ก ์ธํด ์ฌ๋ผ์ง ์ ์์ต๋๋ค.
https://groups.google.com/d/msg/julia-users/t0KvvESb9fA/6_ZAp2ujLpMJ
https://groups.google.com/d/msg/julia-users/DL8ZsK6vLjw/w19Zf1lVmHMJ
https://groups.google.com/d/msg/julia-users/YGmDUZGOGgo/LmsorgEfXHgJ
์ด ๋ฌธ์ ์ ๋ชฉ์ ์ ์ํด ๊ตฌ๋ฌธ์ ๊ฒ์ผ๋ฆ๊ณผ ๋ถ๋ฆฌํฉ๋๋ค. ๋น์ ์ ์ ์์ ํฅ๋ฏธ๋กญ์ต๋๋ค.
_๋๋ฌด ๋ง์ ์ _์ด ์๋ ์ง์ ์ด ์จ ๊ฒ ๊ฐ์ต๋๋ค. ํนํ ์ค๊ฐ ์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
x .|> x->exp(-x ^ 2) * sin(k * x) + im * log(x - 1)
๊ธฐ๋ณธ ๊ธฐ๋ฅ๊ณผ ํจ์จ์ ์ธ map
( .|>
)๋ง โโ์์ผ๋ฉด ๋ฉ๋๋ค.
์ด๊ฒ์ ํฅ๋ฏธ๋ก์ด ๋น๊ต์ ๋๋ค.
y .= โฯ exp.(-x .^ 2) .* sin.(k .* x) .+ im * log.(x .- 1)
y = [โฯ exp(-x[i]^ 2) .* sin(k * x[i]) .+ im * log(x[i] - 1) for i = 1:length(x)]
for ...
๋ถ๋ถ์ ํ ์ธํ๋ฉด ์ดํด๋ ฅ์ด ํ ๊ธ์๋ง ๊ธธ์ด์ง๋๋ค. ๋๋ ๊ฑฐ์ ๋ชจ๋ ์ ๋ณด๋ค ์ถ์ฝ๋ ์ดํด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
1์ฐจ์ ์ดํด๋ ๋ชจ์์ ์ ์งํ์ง ์์ง๋ง ์ด์ for i in eachindex(x)
๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
์ดํด์ ํ ๊ฐ์ง ๋ฌธ์ ๋ DataArray๋ฅผ ์ง์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
LazyArray ์์ด๋์ด์ ๋งค์ฐ ์ ์ฌํด ๋ณด์ด๋ .Net์์ ๋ฐ์ํ ๋ง์ ์ผ๋ค์ ์ดํด๋ณด๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ๊ทธ๊ฒ์ LINQ ์คํ์ผ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋งค์ฐ ์ ์ฌํด ๋ณด์ ๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๊ฐ์ง๊ณ ์๋ ์์๋ณ ํญ๋ชฉ์ฒ๋ผ ๋ณด์ด๋ ๊ตฌ๋ฌธ์ ๊ฐ์ง๊ณ ์์ง๋ง ์ค์ ๋ก๋ ํด๋น ๊ตฌ๋ฌธ์ด ํํ์ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ณ ํด๋น ํํ์ ํธ๋ฆฌ๊ฐ ๋์ค์ ์ด๋ค ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ํ๊ฐ๋ฉ๋๋ค. . ์ ์ง ๊ฐ๊น์ฃ ?
.Net์์ ๊ทธ๋ค์ ์ด๋ฌํ ์ ํธ๋ฆฌ๋ฅผ ์ฌ๋ฌ CPU์์ ๋ณ๋ ฌ๋ก ์คํํ๊ฑฐ๋(.AsParallel()์ ์ถ๊ฐํ์ฌ) DryadLINQ ๋๋ http:// ์์ ๋๊ท๋ชจ ํด๋ฌ์คํฐ์์ ์คํํ ์ ์์ต๋๋ค.
๋ด ์๊ฐ์๋ Blaze๋ ๊ทธ๋ฐ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ๊ณ์ฐ์ ์ค๋ช ํ๋ ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๊ณ ๋ค๋ฅธ ์คํ ์์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ช ํํ์ง๋ ์์ง๋ง ์ด ์ ์ฒด ๋ฌธ์ ๋ ์ฝ๋์ ๊ฐ์ ๋ฎ์ ์์ค์ ํจ์จ์ ์ธ SIMD๋ฅผ ์์ฑํ ์ ์๋ ๋ฐฉ๋ฒ๊ณผ ์ด๊ฒ์ด GPU ์ปดํจํ , ํด๋ฌ์คํฐ๋ง, ๋ณ๋ ฌ์ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ๋ชจ๋์ ๋งฅ๋ฝ์์ ์ดํด๋ด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ณ์ฐ ๋ฑ
์, ๋ ๊ธด ์์ ์ ์ด ๋๋ฌด ๋ง๋ค๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ฐ์ ์งง์ ๊ฒ์ด ๋ ์ผ๋ฐ์ ์ด๋ฉฐ ์ด ๊ฒฝ์ฐ ์งง์ ๊ตฌ๋ฌธ์ ๊ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋๋ ๊ฒ์ผ๋ฆ๊ณผ ๊ตฌ๋ฌธ์ ๋ถ๋ฆฌํ๊ณ ์ถ์ง๋ง ๊ทํ์ ์๊ฒฌ์ ๋ฐ๋ฅด๋ฉด ๋งค์ฐ ์ด๋ ค์ด ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ํญ์ ๋ ๊ฐ์ง๋ฅผ ํผํฉํฉ๋๋ค!
y = [sqrt(x + 2) over x]
์ ๊ฐ์ ์ดํด ๊ตฌ๋ฌธ์ ์ ์ฉํ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ @johnmyleswhite ๊ฐ ์ธ๊ธํ๋ฏ์ด DataArrays
๋ ๋ฌผ๋ก ํฌ์ ํ๋ ฌ๊ณผ ๋ชจ๋ ์๋ก์ด ๋ฐฐ์ด ์ ํ๋ ์ง์ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ๊ตฌ๋ฌธ๊ณผ ๊ธฐ๋ฅ์ ํผํฉํ ๊ฒฝ์ฐ์
๋๋ค.
๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ ์ ์์ด ๋์์ ๋ํด ์ ๊ณตํ๋ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1) y[:] = sqrt.(x .+ 2)
๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋น ์๋ ์ ์๋ฆฌ ํ ๋น ์ง์.
2) sum((x .- y).^2, 1)
์ ๊ฐ์ ๋ฌดํ ๋น ๊ฐ์ ์ง์.
๋ค๋ฅธ ์๋ฃจ์ ๊ณผ ํจ๊ป ์ ๊ณต๋ ์ ์์ต๋๊น(๊ตฌ๋ฌธ ๋ฌธ์ ๋ฌด์)?
@davidanthoff ๊ฐ์ฌํฉ๋๋ค. ์ง๊ธ ์ดํด๋ณด๊ณ ์์ต๋๋ค( LazyArray
๋ ๋ณ๋ ฌ ์ปดํจํ
์ ์ง์ํ๋๋ก ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค).
์๋ง๋ ์ด๊ฒ์ Generator์ ๊ฒฐํฉ๋ ์ ์์ต๋๋ค โ ๊ทธ๋ค์ ๋ํ ์ผ์ข
์ ๊ฒ์ผ๋ฅธ ๋ฐฐ์ด์ด๊ธฐ๋ ํฉ๋๋ค. ๋๋ [f(x) over x]
์ดํด ๊ตฌ๋ฌธ์ด ๋ค์ ๋ง์์ ๋ญ๋๋ค. ๋น๋ก ์ ์ฌ์ฉ์์๊ฒ๋ ๊ฐ๋
์ ์ผ๋ก ์ด๋ ค์ธ ์ ์์ง๋ง(๋์ผํ ์ด๋ฆ์ด ์์์ ๋ฐฐ์ด ์์ฒด์ ๋ชจ๋ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์) ๊ฐ๋
์ ์ผ๋ก ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋๊ดํธ๊ฐ ์๋ ์ดํด๊ฐ ์์ฑ๊ธฐ๋ฅผ ์์ฑํ๋ค๋ฉด(๋ด๊ฐ ์ค๋์ ์ ๊ฐ์ง๊ณ ๋์๋ ๊ฒ์ฒ๋ผ), ๋๊ดํธ๊ฐ ์๋ ์ด๋ฌํ ์๋ก์ด over-x-style-comprehensions๋ฅผ ์ฌ์ฉํ์ฌ LazyArray๋ฅผ ์ฆ์ ์์งํ๋ ๋์ ๋ฐํํ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ์ต๋๋ค.
@mbauman ์, ์์ฑ๊ธฐ์ ์ง์ฐ ๋ฐฐ์ด์ ๋ง์ ์์ฑ์ ๊ณต์ ํฉ๋๋ค. ๋๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๊ธฐ/๊ฒ์ผ๋ฅธ ๋ฐฐ์ด์ ์์งํ๊ณ ๊ฒ์ผ๋ฅธ ๊ฐ์ฒด๋ฅผ ์ ์งํ๊ธฐ ์ํด ๋๊ดํธ๋ฅผ ์ถ๊ฐํ์ง ์๋ ์์ด๋์ด๋ ๋ฉ์ง๊ฒ ๋ค๋ฆฝ๋๋ค. ๋ฐ๋ผ์ ์์ ์์ ๊ด๋ จํ์ฌ 1) y[:] = sqrt(x + 2) over x
๋ฐ sum((x - y)^2 over (x, y), 1)
๋ฅผ ๋ชจ๋ ์์ฑํ ์ ์์ต๋๋ค over
์์ ๊ฑฐ ์
ฐ๋ฉ ์ธ์
์ ์์ํ๊ณ ๊ธฐ๋ณธ ์ฌํญ์ ๋จผ์ ์ง์ค).
f(x) over x
์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค. ์๋ก์ด ํค์๋๋ฅผ ํผํ๊ธฐ ์ํด f(x) for x
๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ค์ ๋ก [f(x) for x=x]
๋ ์ด๋ฏธ ์๋ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ map
์ ํด๋นํ๋ ์ดํด๋ฅผ ๋ง๋ค์ด์ผ ๋น๋ฐฐ์ด์์ ์๋ํ ์ ์์ต๋๋ค. Array
๋ ๊ธฐ๋ณธ๊ฐ์ผ ๋ฟ์
๋๋ค.
๋๋ over
์์ด๋์ด๋ฅผ ์ข์ํ๊ฒ ๋์๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค. over
๋งต๊ณผ for
์ฌ์ด์ ํ ๊ฐ์ง ์ฐจ์ด์ ์ ์ฌ๋ฌ ๋ฐ๋ณต์์ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ ์ผ์
๋๋ค. [f(x, y) for x=x, y=y]
๋ ํ๋ ฌ์ ์์ฑํฉ๋๋ค. ์ง๋์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ ํ ๋ฒกํฐ๊ฐ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด [f(x, y) over x, y]
๋ [f(x, y) for (x,y) = zip(x, y)]]
์ ๊ฐ์ต๋๋ค. ์ด ๋๋ฌธ์ ์ฌ์ ํ ์ถ๊ฐ ํค์๋ over
๋ฅผ ๋์
ํ๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ์ ๊ธฐ๋๋ฉด์ ์ฌ๋ฌ ๋ฒกํฐ์ ๋ํ map
ing์ด ๋งค์ฐ ์ผ๋ฐ์ ์ด๊ณ ๊ฐ๊ฒฐํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด๋ด, ๋๋ ๊ตฌ๋ฌธ์ ๋ํด Jeff๋ฅผ ์ค๋ํ์ต๋๋ค! ;-)
์ด๊ฒ์ #4470 ์์ ์ํ๋ฏ๋ก ์ง๊ธ์ 0.4-projects์ ์ถ๊ฐํฉ๋๋ค.
๋ ผ์์ ์์ง๋ฅผ ์ดํดํ๋ค๋ฉด ์ฃผ์ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๋งคํ๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ธ๋ผ์ธ์ ์ฌ์ฉํ์ฌ ์ํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ์๋ ์์ง๋ง ์ธ๋ผ์ธ์ด ์๋ํ๋์ง ํ์ธํ๋ ๋ฐ ์ ๋ง ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ด๋ป์ต๋๊น? ์ถ๋ก ๋ ๋ฐ์ดํฐ ์ ํ์ ๋ฐ๋ผ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ DataArray์์ ์ ์ถํ ์ ์์ผ๋ฉด DataArrays ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ๋งต ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค. SomeKindOfStream์ธ ๊ฒฝ์ฐ ์ ๊ณต๋ ์คํธ๋ฆผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ํ์ ์ ์ถํ ์ ์์ผ๋ฉด ๋์ ์ผ๋ก ๋์คํจ์น๋ ์ผ๋ฐ ๊ตฌํ์ ์ฌ์ฉํฉ๋๋ค.
์ด๊ฒ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ฑ์๊ฐ ๊ทธ๋ฌํ ๋งคํฌ๋ก๋ฅผ ์์ฑํ๋๋ก ๊ฐ์ ํ ์ ์์ง๋ง ์์ฑ์๊ฐ ์ค์ ๋ก ํจ์จ์ ์ธ ์คํ์ ์ํ ๊ฒฝ์ฐ์๋ง ํ์ํ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ์ฐ๊ณ ์๋ ๋ด์ฉ์ด ๋ถ๋ถ๋ช
ํ๋ค๋ฉด [EXPR for i in collection if COND]
์ ๊ฐ์ ๊ฒ์ด eval(collection_mapfilter_macro(:(i), :(EXPR), :(COND)))
๋ก ๋ฒ์ญ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ฌ๊ธฐ์ collection_mapfilter_macro
๋ ์ถ๋ก ๋ ์ปฌ๋ ์
์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋ฉ๋๋ค.
์๋์, ์ฐ๋ฆฌ๋ ๊ทธ๋ฐ ์ผ์ ํ๊ณ ์ถ์ง ์์ต๋๋ค. DataArray๊ฐ map
(๋๋ ์ด์ ์์ํ๋ ๊ฒ)์ ์ ์ํ๋ ๊ฒฝ์ฐ ์ถ๋ก ํ ์ ์๋ ํญ๋ชฉ์ ๊ด๊ณ์์ด DataArray์ ๋ํด ํญ์ ํด๋น ์ ์๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ์ค์ ๋ก ๊ตฌํ์ ๊ดํ ๊ฒ์ด ์๋๋ผ ๊ตฌ๋ฌธ์ ๊ดํ ๊ฒ์
๋๋ค. ํ์ฌ ๋ง์ ์ฌ๋๋ค์ด x
๊ฐ ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ ์์์ ์ผ๋ก ๋งคํํ๋ sin(x)
์ ์ต์ํ์ง๋ง ๊ทธ ์ ๊ทผ ๋ฐฉ์์๋ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฌธ์ ๋ ์ด๋ค ๋์ฒด ๊ตฌ๋ฌธ์ด ํ์ฉ๋๋์ง์
๋๋ค.
1) y[:] = sqrt.(x .+ 2)
๋ฅผ ์ฌ์ฉํ ํ ๋น ์๋ ์ธํ๋ ์ด์ค ํ ๋น ์ง์
2) sum((x .- y).^2, 1)
์ ๊ฐ์ ๋ฌดํ ๋น ๊ฐ์ ์ง์
y = โฯ exp(-x^2) * sin(k*x) + im * log(x-1)
for
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด ์ธ ๊ฐ์ง ์๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฒ์
๋๋ค.
1) y[:] = [ sqrt(x + 2) for x ])
2) sum([ (x-y)^2 for x,y ], 1)
๊ทธ๋ฆฌ๊ณ
y = [ โฯ exp(-x^2) * sin(k*x) + im * log(x-1) for x,k ]
๋๋ ์ด๊ฒ์ ์๋นํ ์ข์ํ๋ค! ์์ ๋ฐฐ์ด์ ์์ฑํ๋ค๋ ์ฌ์ค์ ๋งค์ฐ ๋ช ๋ฐฑํ๋ฉฐ ์ฌ์ ํ ์ฝ๊ธฐ ์ฝ๊ณ ๊ฐ๊ฒฐํฉ๋๋ค.
์ฌ์ํ ์ง๋ฌธ์ด์ง๋ง x[:] = [ ... for x ]
์ ์์ ๋ฐฐ์ด์ ํ ๋นํ์ง ์๊ณ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ๋ ๋ง๋ฒ์ด ์์ต๋๊น?
์ด๊ฒ์ด ๋ง์ ์ด์ ์ ์ ๊ณตํ ์ง ํ์ ํ ์ ์์ง๋ง ํฐ ์ด๋ ์ด์ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ค๋ฅธ ๊ณณ์์ ๋
ผ์๋์ด์ผ ํ๋ ์์ ํ ๋ค๋ฅธ ์์ ์ฃผ์ ์์ผ ์ ์๋ค๊ณ ๋ฏฟ์ ์ ์์ต๋๋ค.
@Mike43110 ๊ทํ์ x[:] = [ ... for x ]
๋ x[:] = (... for x)
์์ฑ๋ ์ ์์ผ๋ฉฐ, RHS๋ ์ฌ๋ณธ์ ํ ๋นํ์ง ์๊ณ x
๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์์๋ณ๋ก ์์ง๋๋ ์์ฑ๊ธฐ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๊ฒ์ด ์์ LazyArray
์คํ์ ๋ํ ์์ด๋์ด์์ต๋๋ค.
[f <- y]
๊ตฌ๋ฌธ์ ์ถ๋ ฅ ์ ํ์ ์๊ณ f(y[1])
์์ ๋ค๋ฅธ ์์๋ฅผ ๋ณด๊ฐํ ํ์๊ฐ ์๋ ๋งต์ ๋ํ Int[f <- y]
๊ตฌ๋ฌธ๊ณผ ๊ฒฐํฉํ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
ํนํ mapslices
์ ๋ํ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค๋ ์ ๊ณตํ๋ฏ๋ก [f <- rows(A)]
rows(A)
(๋๋ columns(A)
๋๋ slices(A, dims)
)๋ Slice
๋ฅผ ๋ฐํํฉ๋๋ค.
map(f, slice::Slice) = mapslices(f, slice.A, slice.dims)
์ธ๋ฑ์ฑ์ ์ถ๊ฐํ๋ฉด ์ด ์์ ์ด ์กฐ๊ธ ๋ ์ด๋ ค์์ง๋๋ค. ์๋ฅผ ๋ค์ด
f(x[:,j]) .* g(x[i,:])
๊ทธ ๊ฐ๊ฒฐํจ์ ๋ง์ถ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ดํด ์คํ์ผ์ ํญ๋ฐ์ ๊ฝค ๋์ฉ๋๋ค.
[f(x[m,j])*g(x[i,n]) for m=1:size(x,1), n=1:size(x,2)]
์ค์๊ฐ์์ผ๋ก ์ด๊ฒ์ด ์ค์ฒฉ ๋ฐ๋ณต์ ๊ฒฝ์ฐ์ด๋ฉฐ ๋จ์ผ over
๋ก ์ํํ ์ ์์์ ์๊ธฐ ์ํด์๋ ์๋ฆฌํจ์ด ํ์ํ์ต๋๋ค. f
๋ฐ g
๊ฐ ์ฝ๊ฐ ๋น์ธ๋๋ผ๋ ์ด๊ฒ์ด ๋ ๋น ๋ฅผ ์ ์์ต๋๋ค.
[f(x[m,j]) for m=1:size(x,1)] .* [g(x[i,n]) for _=1, n=1:size(x,2)]
ํ์ง๋ง ๋ ์ค๋.
์ด๋ฌํ ์ข
๋ฅ์ ์๋ f.(x[:,j]) .* g.(x[i,:])
๋ฅผ ์ค ์ ์๋ "์ "์ ์ฃผ์ฅํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@JeffBezanson ๊ทํ์ ์๊ฒฌ์ ์๋๊ฐ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. .*
๊ตฌ๋ฌธ์ ์ ๊ฑฐํ๋๋ก ์ ์ํ ์ฌ๋์ด ์์ต๋๊น?
์๋์; ์ ๋ ์ฌ๊ธฐ์ f
๋ฐ g
์ ์ด์ ์ ๋ง์ถ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ์ค ๋์ over x
๋ฅผ ์ถ๊ฐํ ์ ์๋ ์์
๋๋ค.
์๊ฒ ์ต๋๋ค. ๋๊ธ ๋์ ๋์ณค์ต๋๋ค. ์ฌ์ค ์ด ๊ฒฝ์ฐ ์ ๋ฒ์ ์ด ๋ ์ข์ต๋๋ค.
๋ฐฐ์ด ๋ณด๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํฉ๋ฆฌ์ ์ผ๋ก ํจ์จ์ ์ด๊ณ (AFAICT) ๊ทธ๋ ๊ฒ ๋ณด๊ธฐ ํํ์ง ์์ ๋์์ด ์์ต๋๋ค.
[ f(y) * g(z) for y in x[:,j], z in x[i,:] ]
์์ ์๋ ํค์๋๋ฅผ ์ค์ฒฉํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๊น?
f(x)*g(y) over x,y
๋ก ํด์๋๋ค
[f(x)*g(y) for (x,y) = zip(x,y)]
๋ฐ๋ฉด
f(x)*g(y) over x over y
๋๋ค
[f(x)*g(y) for x=x, y=y]
๊ทธ๋ฐ ๋ค์ ์์ ํน์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
f(x[:,n])*g(x[m,:]) over x[:,n] over x[m,:]
ํธ์ง: ๋์ด์ผ๋ณด๋ฉด, ๊ทธ๊ฒ์ ๋ด๊ฐ ์๊ฐํ๋ ๊ฒ๋งํผ ๊ฐ๊ฒฐํ์ง ์์ต๋๋ค.
@JeffBezanson ์ด๋์
f(x[:i,n]) * g(x[m,:i]) over i
f.(x[:,n] .* g.(x[m,:])
์ ํด๋นํ๋ ๊ฐ์ ์ ๊ณตํฉ๋๋ค. ์ ๊ตฌ๋ฌธ x[:i,n]
์ i
์ด ์ปจํ
์ด๋ x[:,n]
์ ์ธ๋ฑ์ค์ ๋ํ ๋ฐ๋ณต์๋ก ๋ก์ปฌ๋ก ๋์
๋จ์ ์๋ฏธํฉ๋๋ค. ๊ตฌํ์ด ๊ฐ๋ฅํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ถ์
ํ๊ฑฐ๋ ๋ฒ๊ฑฐ๋กญ์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ๊ตฌ๋ฌธ ์์ฒด๋ ๋ฐ๋ณต์, ์ฆ 1:length(x[:,n])์ ๋ํ ๊ฒฝ๊ณ๋ฅผ ์ ๊ณตํฉ๋๋ค. ํค์๋์ ๊ดํ ํ "over"๋ ์ ์ฒด ๋ฒ์๊ฐ ์ฌ์ฉ๋๋ค๋ ์ ํธ์ผ ์ ์์ง๋ง "for"๋ ์ฌ์ฉ์๊ฐ 1:length(x[:,n])์ ํ์ ๋ฒ์๋ฅผ ์ง์ ํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
f(x[:i,n]) * g(x[m,:i]) for i in 1:length(x[:,n])-1
.
@davidagold , :i
๋ ์ด๋ฏธ i
๊ธฐํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ค, ์ข์ ์ง์ ์ ๋๋ค. ๊ธ์, ์ ์ด ๊ณต์ ํ ๊ฒ์์ด๋ผ๋ฉด ์ด๋จ๊น์?
f(x[.i,n]) * g(x[m,.i]) over i
์ฌ๊ธฐ์ ์ ์ i
๊ฐ 1:length(x[:,n)์ ๊ฑธ์ณ ๋ฐ๋ณต์๋ก ๋ก์ปฌ์์ ๋์
๋๊ณ ์์์ ๋ํ๋
๋๋ค. ๋ณธ์ง์ ์ผ๋ก ์ด๊ฒ์ด ํจ์ ์์ ์์ ๋ฐฐ์ด ๋๋ ์ธ๋ฑ์ค ์์ ์ผ๋ก ์ ํ๊ธฐ๋ฒ์ ์ ํํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด "์ ํฌ๋ฆฌํ"์์ ํ๋๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค. Jeff๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค.
[ f(g(e^(x[m,.i]))) * p(e^(f(y[.i,n]))) over i ]
๋ฐ๋๋ก
f.(g.(e.^(x[m,:]))) .* p.(e.^(f.(y[:,n])))
๋๋ ํ์๊ฐ ์ฝ๊ฐ ๋ ์งง๋ค๊ณ ์๊ฐํ์ง๋ง. [ํธ์ง: ๋ํ ๋ชจํธ์ฑ์ด ์์ ๋ over i
๋ฅผ ์๋ตํ ์ ์๋ค๋ฉด ์ค์ ๋ก ๊ตฌ๋ฌธ์ด ์ฝ๊ฐ ๋ ์งง์ต๋๋ค.
[ f(g(e^(x[m,.i]))) * p(e^(f(y[.i,n]))) ]
]
์ดํด ๊ตฌ๋ฌธ์ ํ ๊ฐ์ง ์ ์ฌ์ ์ธ ์ด์ ์ ๋ ๋์ ๋ฒ์์ ์์๋ณ ์์
ํจํด์ ํ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ํ์๊ฐ x[m, .i]
i
๋ก ์ธ๋ฑ์ฑํ๋ ๊ฒ์ด ์์์ ์ผ๋ก ๋ชจ๋๋ก ๊ธธ์ด(x[m,:])๋ผ๋ ๊ฒ์ ์ดํดํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
[ f(x[.i]) * g(y[.j]) over i, j=-i ]
x
์ ์์๋ฅผ y
์ ์์์ ๋ฐ๋ ์์๋ก ๊ณฑํ๋ ค๋ฉด, ์ฆ y
์ ๋ง์ง๋ง ์์์ ๋ํด x
์ ์ฒซ ๋ฒ์งธ ์์ ๋ฑ ํ๋๋ ์ธ ์ ์์ต๋๋ค
[ f(x[.i]) * g(y[.j]) over i, j=i+1 ]
x
์ i
์์์ $# y
์ i+1
์์๋ฅผ ๊ณฑํฉ๋๋ค(์ฌ๊ธฐ์ x
์ ๋ง์ง๋ง ์์๋ ๊ณฑํฉ๋๋ค. ์ด ์ปจํ
์คํธ์์ ๋ชจ๋๋ก ๊ธธ์ด(x))๋ก ์ดํด๋๋ ์ธ๋ฑ์ฑ์ผ๋ก ์ธํด y
์ ์ฒซ ๋ฒ์งธ ์์์ ์ํด. ๊ทธ๋ฆฌ๊ณ p::Permutation
๊ฐ (1, ..., length(x)) ์์ด์ด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์์ต๋๋ค.
[ f(x[.i]) * g(y[.j]) over i, j=p(i) ]
x
์ i
์์์ y
์ p(i)
์์๋ฅผ ๊ณฑํฉ๋๋ค.
์ด์จ๋ , ๊ทธ๊ฒ์ ์ ์ ์ผ๋ก ์ถ์ธก์ ์ธ ๋ฌธ์ ์ ๋ํ ์ธ๋ถ์ธ์ ๊ฒธ์ํ ์๊ฒฌ์ผ ๋ฟ์ ๋๋ค. =p ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ ๊ณ ๋ คํ๋ ๋ฐ ์๊ฐ์ ๋ค์ธ ๊ฒ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
r ์คํ์ผ ์ฌํ์ฉ์ ์ฌ์ฉํ๋ ๋ฒกํฐํ ๋ฒ์ ์ ๊ฝค ์ ์ฉํ ์ ์์ต๋๋ค. ์ฆ, ๊ฐ์ฅ ํฐ ์ธ์์ ํฌ๊ธฐ์ ์ผ์นํ์ง ์๋ ์ธ์๋ ์ฌํ์ฉ์ ํตํด ํ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์๋ ์ธ์ ๋ฑ์ ์์ ๊ด๊ณ์์ด ์ํ๋ ๋ชจ๋ ๊ฒ์ ์ฝ๊ฒ ๋ฒกํฐํํ ์ ์์ต๋๋ค.
unvectorized_sum(a, b, c, d) = a + b + c + d
vectorized_sum = @super_vectorize(unvectorized_sum)
a = [1, 2, 3, 4]
b = [1, 2, 3]
c = [1, 2]
d = 1
A = [1, 2, 3, 4]
B = [1, 2, 3, 1]
C = [1, 2, 1, 2]
D = [1, 1, 1, 1]
vectorized_sum(a, b, c, d) = vectorized_sum(A, B, C, D) = [4, 7, 8, 8]
๋๋ ์ฌํ์ฉ์ด ํธ์์ฑ์ ์ํด ๋๋ฌด ๋ง์ ์์ ์ฑ์ ์์ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ฌํ์ฉ์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ์คํ๋๋ ๋ฒ๊ทธ๊ฐ ์๋ ์ฝ๋๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
R์ ํ๋์ ๋ํด ์ฒ์ ์ฝ์์ ๋ ๋๋ ์ฆ์ ์ ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ด ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํ๋์ง ๊ถ๊ธํ์ต๋๋ค. ํฌ๊ธฐ๊ฐ ์ผ์นํ์ง ์๋ ๋ฐฐ์ด์์ ์์์ ์ผ๋ก ์ํํ๋ ๊ฒ์ ์ ๋ง ์ด์ํ๊ณ ๋๋ผ์ด ์ผ์ ๋๋ค. ๋ ์์ ๋ฐฐ์ด์ ํ์ฅํ๋ ค๋ ๋ช ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ง๋ง ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ก ํจ๋ฉ ๋๋ ๋ ์์ ๋ฐ๋ณต, ์ธ์ฝ, ์ค๋ฅ ๋๋ ๊ธฐํ ์ฌ๋ฌ ์์ฉ ํ๋ก๊ทธ๋จ ์ข ์์ ์ํ ์ ์์ต๋๋ค. ์ ํ.
@super_vectorize
์ ์ฌ์ฉ ์ฌ๋ถ๋ ์ฌ์ฉ์์ ์์ ๋ฌ๋ ค ์์ต๋๋ค. ๋ค์ํ ๊ฒฝ์ฐ์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, R์์,
c(1, 2, 3) + c(1, 2)
[1] 2 4 4
Warning message:
In c(1, 2, 3) + c(1, 2) :
longer object length is not a multiple of shorter object length
๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์๋ ์ ํ ํญ๋ชฉ์ผ๋ก ๋ง๋๋ ๋ฐ ์ด์๊ฐ ์์ง๋ง ํจํค์ง์์ ์ํํ ์ ์์ ๋ ๊ธฐ๋ณธ ์ธ์ด๋ก ๊ตฌํํ ํ์๊ฐ ์์ต๋๋ค.
@vectorize_1arg
๋ฐ @vectorize_2arg
๋ ๋ชจ๋ Base์ ์ด๋ฏธ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ์ต์
์ด ๋ค์ ์ ํ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ๋ Base์์ @vectorize_1arg
๋ฐ @vectorize_2arg
๋ฅผ ์ ๊ฑฐํ๋ ์์คํ
์ค๊ณ์ ์ค์ ์ ๋ก๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ธ์ด์์ ๋ฒกํฐํ๋ ํจ์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ ๋์ ์ถ์ํ๋ก ๋์ฒดํ๋ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด ์ฌํ์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์์ต๋๋ค.
[ A[i] + B[mod1(i,length(B))] for i in eachindex(A) ]
๋์๊ฒ ๊ทธ๊ฒ์ ๊ทธ๊ฒ์ ์์ฑํ๋ ์ด์์ ์ธ ๋ฐฉ๋ฒ์ ๊ฝค ๊ฐ๊น์ต๋๋ค. ์๋ฌด๋ ๋น์ ์ ์ํด ๊ทธ๊ฒ์ ๊ตฌ์ถ ํ ํ์๊ฐ ์์ต๋๋ค. ์ฃผ์ ์ง๋ฌธ์ (1) ์ด๊ฒ์ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์๋์ง, (2) ๋ค๋ฅธ ์ปจํ ์ด๋ ์ ํ์ผ๋ก ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
@davidagold ์ ์ ์์ ๋ณด๊ณ var:
๋ณ์๊ฐ ์ฝ๋ก ์์ ์ด๋ฆ์ด ๋๋ ๊ทธ๋ฐ ์ข
๋ฅ์ ์ฌ์ฉํ ์ ์๋์ง ๊ถ๊ธํ์ต๋๋ค. ์ด ๊ตฌ๋ฌธ์ด A[var:end]
๋ฅผ ์๋ฏธํ๋ ๊ฒ์ ๋ณด์์ผ๋ฏ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
f(x[:,j]) .* g(x[i,:])
๋ f(x[a:,j]) * g(x[i,b:]) for a, b
๊ฐ ๋๋ฉฐ ๊ทธ๋ค์ง ๋์์ง ์์ต๋๋ค.
์ฌ๋ฌ ๊ฐ์ ์ฝ๋ก ์ ์ฝ๊ฐ ์ด์ํ ๊ฒ์ ๋๋ค.
f(x[:,:,j]) .* g(x[i,:,:])
-> f(x[a:,a:,j]) * g(x[i,b:,b:]) for a, b
๋ ์ด๊ฒ์ ๋ํ ๋์ ์ด๊ธฐ ์๊ฐ์ด์์ต๋๋ค.
์, ์ฌ๊ธฐ ์ฌํ์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ๊ฐ๋ตํ ์ค๋ช ์ด ์์ต๋๋ค. n์ฐจ์ ๋ฐฐ์ด์ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํฉ๋๋ค. ๋ฒกํฐ์ ์ ์ฌํ๊ฒ ํํ์ ํตํฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
using DataFrames
a = [1, 2, 3]
b = 1
c = [1 2]
d = <strong i="6">@data</strong> [NA, 2, 3]
# coerce an array to a certain size using recycling
coerce_to_size = function(argument, dimension_extents...)
# number of repmats needed, initialized to 1
dimension_ratios = [dimension_extents...]
for dimension in 1:ndims(argument)
dimension_ratios[dimension] =
ceil(dimension_extents[dimension] / size(argument, dimension))
end
# repmat array to at least desired size
if typeof(argument) <: AbstractArray
rep_to_size = repmat(argument, dimension_ratios...)
else
rep_to_size =
fill(argument, dimension_ratios...)
end
# cut down array to exactly desired size
dimension_ranges = [1:i for i in dimension_extents]
dimension_ranges = tuple(dimension_ranges...)
rep_to_size = getindex(rep_to_size, dimension_ranges...)
end
recycle = function(argument_list...)
# largest dimension in arguments
max_dimension = maximum([ndims(i) for i in argument_list])
# initialize dimension extents to 1
dimension_extents = [1 for i in 1:max_dimension]
# loop through argument and dimension
for argument_index in 1:length(argument_list)
for dimension in 1:ndims(argument_list[argument_index])
# find the largest size for each dimension
dimension_extents[dimension] = maximum([
size(argument_list[argument_index], dimension),
dimension_extents[dimension]
])
end
end
expand_arguments =
[coerce_to_size(argument, dimension_extents...)
for argument in argument_list]
end
recycle(a, b, c, d)
mapply = function(FUN, argument_list...)
argument_list = recycle(argument_list...)
FUN(argument_list...)
end
mapply(+, a, b, c, d)
๋ถ๋ช ํ ์ด๊ฒ์ ๊ฐ์ฅ ์ฐ์ํ๊ฑฐ๋ ๋น ๋ฅธ ์ฝ๋๊ฐ ์๋๋๋ค(์ ๋ ์ต๊ทผ R ์ด๋ฏผ์์ ๋๋ค). ์ฌ๊ธฐ์์ @vectorize ๋งคํฌ๋ก๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํธ์ง: ๊ฒฐํฉ๋ ์ค๋ณต ๋ฃจํ
ํธ์ง 2: ๊ฐ์ ๋ก ํฌ๊ธฐ๋ฅผ ๋ถ๋ฆฌํ์ต๋๋ค. ํ์ฌ 0-2 ์ฐจ์์์๋ง ์๋ํฉ๋๋ค.
ํธ์ง 3: ์ด ์์
์ ์ํํ๋ ์ฝ๊ฐ ๋ ์ฐ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๋ ๋ชจ๋ ์ธ๋ฑ์ฑ์ ์ฌ์ฉํ์ฌ ํน๋ณํ ์ ํ์ ๋ฐฐ์ด์ ์ ์ํ๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฑด,
special_array = [1 2; 3 5]
special_array.dims = (10, 10, 10, 10)
special_array[4, 1, 9, 7] = 3
ํธ์ง 4: ์์ฑํ๊ธฐ ์ด๋ ค์ ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ๊ถ๊ธํ ์ ์ด ์กด์ฌํฉ๋๋ค: hcat ๋ฐ vcat์ n์ฐจ์ ์ผ๋ฐํ? ๊ฐ ํน์ ์์น์ ์ธ๋ฑ์ค ๋ชฉ๋ก์ด๋ ํํ๋ก n์ฐจ์ ๋ฐฐ์ด(์ฃผ์ด์ง ๋ฐฐ์ด์ ํฌ๊ธฐ์ ์ผ์น)์ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น? repmat์ n์ฐจ์ ์ผ๋ฐํ?
[pao: ๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์]
์ค์ ๋ก ์๋ํ๊ธด ํ์ง๋ง Julia์์ foo = function(x,y,z) ... end
๊ตฌ๋ฌธ์ผ๋ก ํจ์๋ฅผ ์ ์ํ๊ณ ์ถ์ง๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ต๋ช
ํจ์์ ๋ํ ์ด๋ฆ์ ์์๊ฐ ์๋ ๋ฐ์ธ๋ฉ์ด ์์ฑ๋ฉ๋๋ค. Julia์์๋ ์ผ๋ฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ค์ด๋ฉฐ ํจ์์ ๋ํ ๋ฐ์ธ๋ฉ์ ์๋์ผ๋ก ์ผ์ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์ฐํ ์ฑ๋ฅ์ ์ป๊ฒ ๋ฉ๋๋ค.
์ repmat๊ฐ ์ฌ๊ธฐ์ ํ์ํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฐ ์์น์ ์ธ๋ฑ์ค๋ก ์ฑ์์ง ๋ฐฐ์ด์ ๊ฒฝ๊ณ ์ ํธ์ด๊ธฐ๋ ํฉ๋๋ค. ์ ์ ์ ๋ณด๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ๋ง์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ๋๋ ๊ทธ๋ฌํ ๊ธฐ์ ์ด ๋ชจ๋ ๊ฒ์ด "๋ฒกํฐํ"๋์ด์ผ ํ๋ ์ธ์ด์์๋ง ์ ๋ง๋ก ์ ์ฉํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. https://github.com/JuliaLang/julia/issues/8450#issuecomment -111898906์์์ ๊ฐ์ด ์ผ๋ถ ์ธ๋ฑ์ค๊ฐ ๋ณํ๋๋ ๋ฃจํ๋ฅผ ์คํํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค, ์ดํด๊ฐ ๋ฉ๋๋ค. ์ฌ๊ธฐ ์์์ด ์์ง๋ง ๋ง์ง๋ง์ ๋ฃจํ์ ์ํํ ๋ค์ @vectorize
๋งคํฌ๋ก๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ํ์
ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
function non_zero_mod(big::Number, little::Number)
result = big % little
result == 0 ? little : result
end
function mod_select(array, index...)
# just return singletons
if !(typeof(array) <: AbstractArray) return array end
# find a new index with moded values
transformed_index =
[non_zero_mod( index[i], size(array, i) )
for i in 1:ndims(array)]
# return value at moded index
array[transformed_index...]
end
function mod_value_list(argument_list, index...)
[mod_select(argument, index...) for argument in argument_list]
end
mapply = function(FUN, argument_list...)
# largest dimension in arguments
max_dimension = maximum([ndims(i) for i in argument_list])
# initialize dimension extents to 1
dimension_extents = [1 for i in 1:max_dimension]
# loop through argument and dimension
for argument_index in 1:length(argument_list)
for dimension in 1:ndims(argument_list[argument_index])
# find the largest size for each dimension
dimension_extents[dimension] = maximum([
size(argument_list[argument_index], dimension),
dimension_extents[dimension]
])
end
end
# more needed here
# apply function over arguments using mod_value_list on arguments at each position
end
ํ ํฌ์์ @JeffBezanson ์ sin(x) over x
๊ตฌ๋ฌธ์ ์ธ๊ธํ๋๋ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์๋๋๋ค.
sin(over x)
? (๋๋ over
๋ฅผ ํค์๋๋ก ์ฌ์ฉํ๋ ๋์ ์ผ๋ถ ๋ฌธ์๋ฅผ ์ฌ์ฉ)
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ฉด #11872๋ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํํฐ์ ๋ฆ์ง ์์์ผ๋ฉด ์ข๊ฒ ์ง๋ง @davidagold ์ ๊ตฌ๋ฌธ ์ ์์ +1์ ์ ๊ณตํ๊ณ ์ถ์ต๋๋ค. ๊ฐ๋
์ ์ผ๋ก ๋ช
ํํ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ์ฐ๊ธฐ์ ์ ๋ง ์์ฐ์ค๋ฝ์ต๋๋ค. .
๊ฐ ๊ฐ์ฅ ์ ์๋ณ๋๋ ๋ฌธ์์ธ์ง ๋๋ ์ค์ ๊ตฌํ์ด ์ผ๋ง๋ ์คํ ๊ฐ๋ฅํ์ง ํ์คํ์ง ์์ง๋ง ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋
์ฆ๋ช
์ ๋ง๋ค ์ ์์ต๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก @devec
ํ์ง๋ง ๊ตฌํํ๊ธฐ๊ฐ ๋ ์ฌ์ธ ์ ์์).
๋ํ ๊ธฐ์กด ๋ฐฐ์ด ์ดํด ๊ตฌ๋ฌธ์ "์ ํฉ"ํ๋ ์ด์ ์ด ์์ต๋๋ค.
result = [g(f(.i), h(.j)) over i, j]
๋
result = [g(f(_i), h(_j)) for _i in eachindex(i), _j in eachindex(j)]
์ด ๋์ ์ฃผ์ ์ฐจ์ด์ ์ ์ ์๊ฐ ์ง๋๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๋ชจ์ ๋ณด์กด์ ๋ ๋ง์ ์ ํ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
over
, range
๋ฐ window
์๋ OLAP ๊ณต๊ฐ์์ ๋ฐ๋ณต์ ๋ํ ์์ ์๋ก ์ผ๋ถ ์ ํ ๊ธฐ์ ์ด ์์ผ๋ฉฐ ์ด๋ ์ผ๊ด๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
๋๋ .
๊ตฌ๋ฌธ์ ๊ด์ฌ์ด ์์ต๋๋ค. ๋ผ์ธ ๋
ธ์ด์ฆ์ ๋ํ ํฌ๋ฆฌํ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
$๋ ์๋ง๋ ์ผ๊ด๋๊ณ , i,j๋ฅผ ํํ์์ผ๋ก ๋ฐ๋ณตํ๋ ๊ฐ์ ์ธํด์ผ๋ก ํฉ๋๊น?
result = [g(f($i), h($j)) over i, j]
ํํ์์ ์๋ ๋ฒกํฐํ๋ฅผ ์ํด ํํ์์ ๋ฒกํฐ ์ค ํ๋๋ฅผ taint
ํ ์ ์๊ณ ์ ํ ์์คํ
์ด ํํ์์ ๋ฒกํฐ ๊ณต๊ฐ์ผ๋ก ๋ค์ด ์ฌ๋ฆด ์ ์์ต๋๊น?
๋๋ julia์ ํํ๋ ฅ์ผ๋ก ์ด๋ฏธ ์ธ ์ ์๋ ์๊ณ์ด ์์ ๊ณผ ์ ์ฌํฉ๋๋ค.
ts_a = GetTS( ... )
ts_b = GetTS( ... )
factors = [ 1, 2, 3 ]
ts_x = ts_a * 2 + sin( ts_a * factors ) + ts_b
๊ด์ฐฐ๋ ๋ ๋ฒกํฐ์ ์๊ณ์ด์ ์ถ๋ ฅํฉ๋๋ค.
๋๋ฝ๋ ์ฃผ์ ๋ถ๋ถ์ ๊ธฐ์กด ๊ธฐ๋ฅ์ ์๋์ผ๋ก ๊ณต๊ฐ์ผ๋ก ๋ค์ด ์ฌ๋ฆฌ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๊ฒ์ ์์ผ๋กํด์ผํฉ๋๋ค
๋ณธ์ง์ ์ผ๋ก ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ ์ํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค ...
abstract TS{K}
function {F}{K}( x::TS{K}, y::TS{K} ) = tsjoin( F, x, y )
# tsjoin is a time series iteration operator
๊ทธ๋ฐ ๋ค์ ํน์ ์์ ์ ์ ๋ฌธํํ ์ ์์ต๋๋ค.
function mean{K}(x::TS{K}) = ... # my hand rolled form
์๋ ํ์ธ์ @JeffBezanson ,
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ์์ ์ธ๊ธ๋ ์๊ฒฌ์ ๋ํ JuliaCon 2015 ์๊ฒฌ์ ๋ํ ํด๊ฒฐ์ฑ
์ ์ ์ํ๊ณ ์ถ์ต๋๋ค.
"[...] ๊ทธ๋ฆฌ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์์๊ฒ ๋ชจ๋ ์ ์ ํ ํจ์์ @vectorize ๋ฅผ ๋ฃ์ผ๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์
๋๋ค. ํจ์๋ฅผ ์์ฑํ ์ ์์ด์ผ ํ๊ณ ๋๊ตฐ๊ฐ๊ฐ ๋ชจ๋ ์์์ ๋ํด ์ด๋ฅผ ๊ณ์ฐํ๋ ค๋ ๊ฒฝ์ฐ ๋งต์ ์ฌ์ฉํฉ๋๋ค."
(๊ทธ๋ฌ๋ ๋๋ ๋ค๋ฅธ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ์ง ์์ ๊ฒ์
๋๋ค. "[..] sin, exp ๋ฑ์ด ๋ฐฐ์ด์ ๋ํด ์์์ ์ผ๋ก ๋งคํ๋์ด์ผ ํ๋ ์ ๋ง ์ค๋๋ ฅ ์๋ ์ด์ ๊ฐ ์์ต๋๋ค.")
Julia v0.40์์๋ @vectrorize ๋ณด๋ค (๋ด ์๊ฒฌ์ผ๋ก๋) ์ข ๋ ๋์ ์๋ฃจ์ ์ ์ป์ ์ ์์์ต๋๋ค.
abstract Vectorizable{Fn}
#Could easily have added extra argument to Vectorizable, but want to show inheritance case:
abstract Vectorizable2Arg{Fn} <: Vectorizable{Fn}
call{F}(::Type{Vectorizable2Arg{F}}, x1, x2) = eval(:($F($x1,$x2)))
function call{F,T1,T2}(fn::Type{Vectorizable2Arg{F}}, v1::Vector{T1}, v2::Vector{T2})
RT = promote_type(T1,T2) #For type stability!
return RT[fn(v1[i],v2[i]) for i in 1:length(v1)]
end
#Function in need of vectorizing:
function _myadd(x::Number, y::Number)
return x+y+1
end
#"Register" the function as a Vectorizable 2-argument (alternative to @vectorize):
typealias myadd Vectorizable2Arg{:_myadd}
<strong i="13">@show</strong> myadd(5,6)
<strong i="14">@show</strong> myadd(collect(1:10),collect(21:30.0)) #Type stable!
์ด๊ฒ์ ๋ค์ ํฉ๋ฆฌ์ ์ด์ง๋ง @vectorize ์๋ฃจ์ ๊ณผ ๋ค์ ์ ์ฌํฉ๋๋ค. ๋ฒกํฐํ๋ฅผ ์ฐ์ํ๊ฒ ํ๋ ค๋ฉด Julia๊ฐ ๋ค์์ ์ง์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
abstract Vectorizable <: Function
abstract Vectorizable2Arg <: Vectorizable
function call{T1,T2}(fn::Vectorizable2Arg, v1::Vector{T1}, v2::Vector{T2})
RT = promote_type(T1,T2) #For type stability!
return RT[fn(v1[i],v2[i]) for i in 1:length(v1)]
end
#Note: by default, functions would normally be <: Function:
function myadd(x::Number, y::Number) <: Vectorizable2Arg
return x+y+1
end
๊ทธ๊ฒ ๋ค์ผ! ๋ฒกํฐํ ๊ฐ๋ฅํ ํจ์์์ ํจ์๋ฅผ ์์๋ฐ์ผ๋ฉด ๋ฒกํฐํํ ์ ์์ต๋๋ค.
๋๋ ๋น์ ์ด ์ฐพ๊ณ ์๋ ๋ผ์ธ์ ๋ฐ๋ผ ์ด๊ฒ์ ๋ฐ๋๋๋ค.
๋ฌธ์ ์ธ์ฌ,
์๋ง
๋ค์ค ์์์ด ์๋ ๊ฒฝ์ฐ ํจ์๋ Vectorizable
๋ฐ ๋ค๋ฅธ ํญ๋ชฉ์์ ์ด๋ป๊ฒ ์์ํฉ๋๊น? ๊ทธ๋ฆฌ๊ณ ํน์ ๋ฉ์๋์ ๋ํ ์์ ์ ๋ณด๋ฅผ ์ผ๋ฐ ํจ์์ ๋ํ ์์ ์ ๋ณด์ ์ด๋ป๊ฒ ์ฐ๊ด์ํฌ๊น์?
@ma-laforge ์ด๋ฏธ ํ ์ ์์ต๋๋ค --- myadd <: Vectorizable2Arg
์ ํ์ ์ ์ํ ๋ค์ $# Number
$ ์ myadd
call
๋ฅผ ๊ตฌํํฉ๋๋ค.
@JeffBezanson์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ค์ ๋ก, ๊ฑฐ์ ๋ด ์๋ฃจ์ ์ด ๋ด๊ฐ ์ํ๋ ๊ฒ๋งํผ ์ข์ ๋ณด์ผ ์ ์์ต๋๋ค.
abstract Vectorizable
#Could easily have parameterized Vectorizable, but want to show inheritance case:
abstract Vectorizable2Arg <: Vectorizable
function call{T1,T2}(fn::Vectorizable2Arg, v1::Vector{T1}, v2::Vector{T2})
RT = promote_type(T1,T2) #For type stability!
return RT[fn(v1[i],v2[i]) for i in 1:length(v1)]
end
#SECTION F: Function in need of vectorizing:
immutable MyAddType <: Vectorizable2Arg; end
const myadd = MyAddType()
function call(::MyAddType, x::Number, y::Number)
return x+y+1
end
<strong i="7">@show</strong> myadd(5,6)
<strong i="8">@show</strong> myadd(collect(1:10),collect(21:30.0)) #Type stable
์ด์ ๋๋ฝ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ชจ๋ ํจ์๋ฅผ "ํ์ ์ ํ"์ผ๋ก ์ง์ ํ์ฌ ์ ์ฒด ์น์ F๋ฅผ ๋ณด๋ค ์ฐ์ํ ๊ตฌ๋ฌธ์ผ๋ก ๋์ฒดํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
function myadd(x::Number, y::Number) <: Vectorizable2Arg
return x+y+1
end
์ฐธ๊ณ : ํธ์ถ ์๋ช
์์ Type{Vectorizable2Arg}
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ณด๋ค ๊ฒฐ๊ณผ ๊ตฌ๋ฌธ์ด ๋ ๋ณด๊ธฐ ์ข๊ธฐ ๋๋ฌธ์ "MyAddType" ์ ํ๊ณผ ํจ์ ์ด๋ฆ์ ์ฑ๊ธํค ๊ฐ์ฒด "myadd"๋ก ๋ง๋ค์์ต๋๋ค.
function call{T1,T2}(fn::Type{Vectorizable2Arg}, v1::Vector{T1}, v2::Vector{T2})
์ฌํ๊ฒ๋ ๊ทํ์ ์๋ต์ ๋ฐ๋ฅด๋ฉด ์ด๊ฒ์ด @vectorize ๋งคํฌ๋ก์ "์ด๋ฆฌ์์"์ ๋ํ ์ ์ ํ ์๋ฃจ์ ์ด _์๋_ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฌธ์ ์ธ์ฌ,
์๋ง
@johnmyleswhite :
๊ทํ์ ์๊ฒฌ์ ๋ตํ๊ณ ์ถ์ง๋ง ์ ๊ฐ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ช ํํ ํ ์ ์์ต๋๊น?
๋ด๊ฐ _ํ ์ ์๋_ ํ ๊ฐ์ง:
"Vectorizable"์๋ ํน๋ณํ ๊ฒ์ด ์์ต๋๋ค. ์์ด๋์ด๋ ๋๊ตฌ๋ ์์ ์ ํจ์ "class"(์: MyFunctionGroupA<:Function
)๋ฅผ ์ ์ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์์ ์ค๋ช
ํ ๋๋ก ๊ณ ์ ํ "ํธ์ถ" ์๋ช
์ ์ ์ํ์ฌ ํด๋น ์ ํ์ ํจ์์ ๋ํ ํธ์ถ์ ํฌ์ฐฉํ ์ ์์ต๋๋ค.
์ ์ ์์ ๋ฒกํฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋์ผ๋ก ์์ฑํ๊ธฐ ์ํด Base ๋ด์ ์ ์๋ ํจ์๊ฐ Base.Vectorizable <: Function
(๋๋ ์ด์ ์ ์ฌํ ๊ฒ)๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ๋ค์๊ณผ ๊ฐ์ ํจํด์ ์ฌ์ฉํ์ฌ ์์ฒด ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ก ์ ์ํฉ๋๋ค.
myfunction(x::MyType, y::MyType) <: Base.Vectorizable
๋ฌผ๋ก promote_type(::Type{MyType},::Type{MyType})
์์ฒด ๋ฒ์ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ด MyType
๋ฅผ ๋ฐํํ์ง ์๋ ๊ฒฝ์ฐ์
๋๋ค.
๊ธฐ๋ณธ ๋ฒกํฐํ ์๊ณ ๋ฆฌ์ฆ์ด ์ถฉ๋ถํ์ง ์์ผ๋ฉด ์ฌ์ฉ์๊ฐ ์์ ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค.
MyVectorizable{nargs} <: Function
call(fn::MyVectorizable{2}, x, y) = ...
myfunction(x::MyType, y:MyType) <: MyVectorizable{2}
์๋ง
@ma-laforge, ๋ถ๋ถ๋ช
ํด์ ์ฃ์กํฉ๋๋ค. Julia๋ ๋จ์ผ ์์์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ณ์ธต ๊ตฌ์กฐ์๋ ํญ์ ์ค์ํ ์ ๋ณด๊ฐ ๋ถ์กฑํ ๊ฒ์ด๋ฏ๋ก ๊ฐ ํจ์์ ๋ํด ๋จ์ผ ์์ ์ ํ์ ์ปค๋ฐํด์ผ ํฉ๋๋ค. myfunction(x::MyType, y::MyType) <: Base.Vectorizable
์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ฉด nullable์ ๊ธฐ๋ฅ์ ์๋ ์์ฑํ๋ Base.NullableLiftable
์ ๊ฐ์ ๊ฐ๋
์ ์ ์ํ๋ ๋ค๋ฅธ ์ฌ๋์ ๊ธฐ๋ฅ์ด ๋์์ด ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ํน์ฑ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค(https://github.com/JuliaLang/julia/pull/13222 ์ฐธ์กฐ). ๋ํ ๋ฉ์๋๋ฅผ ์์(https://github.com/JuliaLang/julia/pull/13555)๋ก ์ ์ธํ ์ ์๋ ์๋ก์ด ๊ฐ๋ฅ์ฑ๋ ๊ด๋ จ๋์ด ์์ต๋๋ค. ์ด๋ ์ด๋ฌํ ๋ฉ์๋๊ฐ ๋ฒกํฐํ ๊ฐ๋ฅํจ์ ์๋์ผ๋ก ์์ํ ์ ์์ต๋๋ค(์ต์ํ ๋จ์ผ ์ธ์ ๋ฉ์๋์ ๊ฒฝ์ฐ).
@johnmyleswhite ,
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด: ๋๋ ๊ทธ๊ฒ์ด ํนํ _this_ ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋์์ธ ํจํด์ ์ ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทํ์ ํจ์๋ Base.Vectorizable
์์ ์์ํ์ง _๊ฐ_์์ต๋๋ค_ ... ๊ทํ์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๋ NullableLiftables
์ ๋ํด ์ ๋ชจ๋ฆ
๋๋ค(๋ด Julia ๋ฒ์ ์๋ ์๋ ๊ฒ ๊ฐ์ต๋๋ค). ๊ทธ๋ฌ๋ Base.Function
์์ ์์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค(๋ด Julia ๋ฒ์ ์์๋ ๋ถ๊ฐ๋ฅ).
NullableLiftable <: Function
๊ทธ๋ฐ ๋ค์ ๋ชจ๋์ _new_ ๋ฒกํฐํ ๊ฐ๋ฅํ ํ์ ์ ํ์ (ํ ๋ฒ๋ง) ๊ตฌํํ ์ ์์ต๋๋ค.
abstract VectorizableNullableLiftable <: NullableLiftable
function call{T1,T2}(fn::VectorizableNullableLiftable, v1::Vector{T1}, v2::Vector{T2})
RT = promote_type(T1,T2) #For type stability!
return RT[fn(v1[i],v2[i]) for i in 1:length(v1)]
end
๋ฐ๋ผ์ ์ด์ ๋ถํฐ <: VectorizableNullableLiftable
ํจ์๋ฅผ ์ ์ํ๋ ์ฌ๋์ ๋ฒกํฐํ ์ฝ๋๊ฐ ์๋์ผ๋ก ์ ์ฉ๋ฉ๋๋ค!
function mycooladdon(scalar1, scalar2) <: VectorizableNullableLiftable
...
ํ๋ ์ด์์ Vectorizable ์ ํ์ ๊ฐ๋ ๊ฒ์ ์ฌ์ ํ โโ์ฝ๊ฐ์ ๊ณ ํต(๊ทธ๋ฆฌ๊ณ ์ฝ๊ฐ ๋ถ์ ์ ํจ)์ด๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค... ๊ทธ๋ฌ๋ ์ ์ด๋ Julia์์ ์ฑ๊ฐ์ ๋ฐ๋ณต(1) ์ค ํ๋๋ฅผ ์ ๊ฑฐํ ๊ฒ์ ๋๋ค(์๋ก _each_๋ฅผ ๋ฑ๋กํด์ผ ํจ) @vectorize_Xarg์ ๋ํ ํธ์ถ์ด ์๋ ํจ์).
(1) Julia๊ฐ ํจ์์ ๋ํ ์์์ ์ง์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค (์: myfunction(...)<: Vectorizable
) - v0.4.0์์๋ ๋ํ๋์ง ์์ต๋๋ค. Julia 0.4.0์์ ์์
ํ ์๋ฃจ์
์ ํดํน์ผ ๋ฟ์
๋๋ค... ์ฌ์ ํ ํจ์๋ฅผ ๋ฑ๋กํด์ผ ํฉ๋๋ค... @vectorize_Xarg๋ฅผ ํธ์ถํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ซ์ง ์์ต๋๋ค.
์๋ง
๋๋ ์ฌ์ ํ ๊ทธ๊ฒ์ด ์ผ์ข
์ ์๋ชป๋ ์ถ์ํ๋ผ๊ณ ์๊ฐํฉ๋๋ค. "๋ฒกํฐํ"ํ ์ ์๊ฑฐ๋ ํด์ผ ํ๋ ํจ์๋ ํน์ ์ข
๋ฅ์ ํจ์๊ฐ ์๋๋๋ค. _Every_ ํจ์๋ map
์ ์ ๋ฌ๋์ด ์ด ๋์์ ์ ๊ณตํฉ๋๋ค.
BTW, ๋ด๊ฐ jb/functions ๋ถ๊ธฐ์์ ์์
ํ๊ณ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก function f(x) <: T
๋ฅผ ์ํํ ์ ์์ต๋๋ค(๋ฌผ๋ก f
์ ์ฒซ ๋ฒ์งธ ์ ์์ ๋ํด์๋ง).
์ข์, ๋๋ ๋น์ ์ด ์ฐพ๊ณ ์๋ ๊ฒ์ ๋ ์ ์ดํดํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค ... ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ด๊ฐ ์ ์ํ ๊ฒ์ด ์๋๋๋ค. ๋ด ์ ์์ @johnmyleswhite ๊ฐ ๊ฐ์ง ๋ฌธ์ ์ ์ผ๋ถ์ผ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค...
...ํ์ง๋ง ์ด์ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์ดํดํ๋ฉด ์๋ฃจ์ ์ด ํจ์ฌ ๊ฐ๋จํด ๋ณด์ ๋๋ค.
function call{T1,T2}(fn::Function, v1::Vector{T1}, v2::Vector{T2})
RT = promote_type(T1,T2) #For type stability!
return RT[fn(v1[i],v2[i]) for i in 1:length(v1)]
end
myadd(x::Number, y::Number) = x+y+1
myadd
์ ํ์ด Function
์ด๋ฏ๋ก call
ํจ์์ ์ํด ํธ๋ฉ๋์ด์ผ ํฉ๋๋ค... ๋ค์๊ณผ ๊ฐ์ ์์
์ ์ํํฉ๋๋ค.
call(myadd,collect(1:10),collect(21:30.0)) #No problem
๊ทธ๋ฌ๋ call
๋ ์ด๋ค ์ด์ ๋ก ํจ์์ ๋ํด ์๋ ๋์คํจ์นํ์ง ์์ต๋๋ค(์ด์ ๋ ํ์คํ์ง ์์).
myadd(collect(1:10),collect(21:30.0)) #Hmm... Julia v0.4.0 does not dispatch this to call...
ํ์ง๋ง ์ด ํ๋ ์ ๋ฐ๊พธ๋ ๊ฒ์ด ๋๋ฌด ์ด๋ ต์ง ์์์ผ ํ๋ค๊ณ ์๊ฐ ํฉ๋๋ค . ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๋ฐ ํฌ๊ด์ ์ธ ๊ธฐ๋ฅ์ ๋ง๋๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ๋๋ผ๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ทธ๊ฒ์ด ๋น์ ์ด ์ํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋ด๊ฐ ์์์ฐจ๋ฆฐ ์ด์ํ ์ : Julia๋ ์ ๋ ฅ๋์ง ์์ ํจ์๋ฅผ ์ด๋ฏธ ์๋ ๋ฒกํฐํํฉ๋๋ค.
myadd(x,y) = x+y+1 #This gets vectorized automatically, for some reason
RE: ์ฏง์ฏง...:
๋ฉ์๋! ํจ์๋ฅผ ์๋ธํ์ดํํ์ฌ ์ด๋ค ๊น๋ํ ์์
์ ํ ์ ์์์ง ๊ถ๊ธํฉ๋๋ค. :).
Julia๋ ์ ๋ ฅ๋์ง ์์ ํจ์๋ฅผ ์ด๋ฏธ ์๋ ๋ฒกํฐํํฉ๋๋ค.
ํจ์ ๋ด๋ถ์ ์ฌ์ฉ๋ +
์ฐ์ฐ์๊ฐ ๋ฒกํฐํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ๋ณด์
๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ์ด ํ๋์ ๋ฐ๊พธ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ต์ง ์์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๋ฐ ํฌ๊ด์ ์ธ ๊ธฐ๋ฅ์ ๋ง๋๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ๋๋ผ๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ทธ๊ฒ์ด ๋น์ ์ด ์ํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋๋ ๋น์ ์ ์์ฝ์ ๊ณต์ ํฉ๋๋ค. ๊ฐ ํจ์ ์์ฒด๊ฐ ํธ์ถ๋ ๋ ์ํํ ์์ ์ ๋งํด์ฃผ๊ธฐ ๋๋ฌธ์ "์ฌ๊ธฐ์ ๋ชจ๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค"๋ผ๊ณ ์ ์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํจ์์ ๋๋ค!
๋๋ ์ด๋ ๊ฒ ๋งํ์ด์ผ ํ๋ค: ... ์ฌ์ฉ์ ์ ์ ๋น-์ ๋์ฝ๋ ์ค์ ์ฐ์ฐ์, ์ฐ๋ฆฌ๋ ์ฌ์ฉ์๊ฐ ์ด๋ฌํ ํต์ฌ ๊ธฐ๋ฅ์ ์ก์ธ์คํ๊ธฐ ์ํด ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ์ ๋ ฅํ๋๋ก ์๊ตฌํ๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. $๊ฐ ์ค์ ๋ก ์ถ๊ฐ๋ ๊ฒ ์ค ํ๋๋ผ๋ ๊ฒ์ ์์ง๋ง, ๊ฐ์ฌํฉ๋๋ค! ์์ฐ, ๊ทธ๋์ ์ด๊ฒ์ ์ค๋๋ Julia์์ ์ค์ ๋ก ์๋ํฉ๋๋ค(๋น๋ก "๋น ๋ฅด์ง๋ ์์ง๋ง...์์ง"):
์ค๋ฆฌ์> ($) = ์ง๋
์ค๋ฆฌ์> ์ฃ $ (0.5 * (abs2 $ (xy)))
@binarybana โฆ
/ \mapsto
์ด๋์?
julia> x, y = rand(3), rand(3);
julia> โฆ = map # \mapsto<TAB>
map (generic function with 39 methods)
julia> sin โฆ (0.5 * (abs2 โฆ (x-y)))
3-element Array{Float64,1}:
0.271196
0.0927406
0.0632608
๋ค์๋ ์์ต๋๋ค.
โค
/ \Mapsto
โผ
/ \longmapsto
โพ
/ \Longmapsto
โค
/ \twoheadmapsto
โธ
/ \multimap
(ํํ ๋งต?)FWIW, ๋๋ ์ ์ด๋ ์ฒ์์๋ \mapsto
๊ฐ ๋๋ค์ ๋์ฒด ๊ตฌ๋ฌธ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ์ํ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ๋ณธ์ง์ ์ผ๋ก (ASCII ํ์ ์์ ->
) Julia์์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. . ๋๋ ์ด๊ฒ์ด ์คํ๋ ค ํผ๋ ์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ํ์ ๋ํด ๋งํ์๋ฉด ... ๋ชจ๋ธ ์ด๋ก ์์ ๊ดํธ๊ฐ ์๋ ํํ์ ํจ์๋ฅผ ์ ์ฉํ์ฌ map
ํํ์ ๋ณธ ์ ์ด ์์ต๋๋ค. ์ฆ, \bar{a}=(a_1, \dots, a_n)
์ด๋ฉด f(\bar{a})
๋ f(a_1, \dots, a_n)
(์ฆ, ๋ณธ์ง์ ์ผ๋ก apply
)์ด๊ณ f\bar{a}
๋ (f(a_1), \dots, f(a_n))
์
๋๋ค. map
). ๋ํ(homomorphism) ๋ฑ์ ์ ์ํ๋ ๋ฐ ์ ์ฉํ ๊ตฌ๋ฌธ์ด์ง๋ง ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์ฝ๊ฒ ์ ์กํ ์ ์๋ ๊ฒ์ ์๋๋๋ค. :-}
\Mapsto
์ ๊ฐ์ ๋ค๋ฅธ ๋์์ ์ด๋ป์ต๋๊น? =>
(Pair)์ ํผ๋ํ์๊ฒ ์ต๋๊น? ์ฌ๊ธฐ์์ ๋ ๊ธฐํธ๋ฅผ ๋๋ํ ๊ตฌ๋ถํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
->
โฆ
๋น์ทํ๊ฒ ๋ณด์ด๋ ๊ธฐํธ๊ฐ ๋ง์ด ์์ต๋๋ค. ๋งค์ฐ ๋ค๋ฅด๊ฒ ๋ณด์ด๊ฑฐ๋ ์์ํ ASCII๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐํธ๊ฐ ๊ทธ๋ ๊ฒ ๋ง์ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋๋ ์ด๊ฒ์ด ์คํ๋ ค ํผ๋ ์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฌธ์ํ์ ๊ฒฝํ์ด ์ด๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์ํ์ญ๋๊น?
๊ธฐํธ์ ๊ฐ์ ๋ค๋ฅธ ํ์ดํ๋ ๋ง์ด ์์ต๋๋ค. ์์งํ ์ํ์์ ๋ฌด์์ ์ฌ์ฉ๋๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๋ฆ์ map
๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด ํ์ดํ๋ง ์ ์ํ์ต๋๋ค! :์๋ค:
๋ด ์์ ์ ->
๊ฐ ASCII์์ โฆ
๋ฅผ ๋ํ๋ด๋ ค๋ Julia์ ์๋๋ผ๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ โฆ
๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์ต๋๋ค. ์ก์์ผ๋ก ๊ตฌ๋ถ์ด ์๋๋๊ฑด ์๋๋๋ค :-)
๋ด ์ง๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์ ์ ๋ฆฝ๋ ์ํ์ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ต์ํ Julia ์ฉ๋ฒ์ด ๊ธฐ์กด ์ฉ๋ฒ๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์๊ฐํด ๋ณด๊ณ ์ถ์ ๊ฒ์
๋๋ค. ์ด๋ฆ์ map
๊ฐ ํฌํจ๋ ๊ธฐํธ๋ฅผ ์ ํํ๋ ๊ฒ์ด ๋
ผ๋ฆฌ์ ์ผ๋ก ๋ณด์ด์ง๋ง ์ด ๊ฒฝ์ฐ ๋งต(๋๋ ๋ค๋ฅธ ์ ํ์ ๋งต ๋๋ ๊ทธ๋ฌํ ๋งต์ ์ ํ)์ ์ ์๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ ๋งค๊ฐ๋ณ์๊ฐ ๋งคํ๋๋ ๋์์ ์ ์ํ์ฌ ์ ์ฒด ๊ธฐ๋ฅ์ ์ ์ํ๋ ๋์ ์ค์ ๋ก ์ง์ ๋ ์ธ์(๋งค๊ฐ๋ณ์ ๊ฐ)๊ฐ ๋งคํ๋๋ ๋์์ ๋์ดํ๋ Pair์์์ ์ฌ์ฉ๋ฒ์๋ ํด๋น๋ฉ๋๋ค. ์ฆ, ๋ช
์์ ์ผ๋ก ์ ์์์
๋๋ค. ์ด๊ฑฐ ํจ์, ๊ฐ๋
์ ์ผ๋ก(์: ์ฌ์ ).
@Ismael-VC ๊ทํ์ ์ ์์ ๋ํ ๋ฌธ์ ๋ map
๋ฅผ ๋ ๋ฒ ํธ์ถํด์ผ ํ์ง๋ง ์ด์์ ์ธ ์๋ฃจ์
์ ์์ ๋ฐฐ์ด์ ํฌํจํ์ง ์๊ณ map((a, b) -> sin(0.5 * abs2(a-b)), x, y)
๋ก ์ค์ด๋ ๊ฒ์
๋๋ค. ๊ฒ๋ค๊ฐ โฆ
๋ฅผ ๋ ๋ฒ ๋ฐ๋ณตํ๋ ๊ฒ์ ์๊ฐ์ ์ผ๋ก๋ ํ์ดํ์ ์ํด ์ข์ง ์์ต๋๋ค(ASCII์ ์์ํ๋ ๊ฒ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค).
R ์ฌ์ฉ์๋ ์ด ์์ด๋์ด๋ฅผ ์ซ์ดํ ์ ์์ง๋ง ~
์ ํ์ฌ ์ค์ ๋งคํฌ๋ก ํน์ ์ฌ๋ก ๊ตฌ๋ฌธ ๋ถ์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ฉด(GLM ๋ฐ DataFrames์ ๊ฐ์ ํจํค์ง๋ ๊ณต์ DSL, ์ฐธ์กฐ https:/๋ฅผ ๋งคํฌ๋ก ๊ตฌ๋ฌธ ๋ถ์์ผ๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. /github.com/JuliaStats/GLM.jl/issues/116), ๊ทธ๊ฒ์ ์ค์ ASCII ์ฐ์ฐ์์ ํฌ๊ทํ ์ํ์ ํด๋ฐฉ์ํฌ ๊ฒ์
๋๋ค.
a ~ b
๋ ๊ธฐ๋ณธ์์ map(a, b)
๋ก ์ ์ํ ์ ์๊ณ a .~ b
๋ broadcast(a, b)
๋ก ์ ์ํ ์ ์์ต๋๊น? ๊ธฐ์กด ์ค์ ์ฐ์ฐ์๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ฉด R ๊ณต์ ์ธํฐํ์ด์ค์ ์๋ฎฌ๋ ์ด์
๊ณผ ๊ฐ์ ๋งคํฌ๋ก DSL์ JuMP๊ฐ <=
๋ฐ ==
๋ก ์ํํ๋ ๊ฒ์ฒ๋ผ ๋งคํฌ๋ก ๋ด๋ถ์ ์ฐ์ฐ์ ํด์์ ์์ ๋กญ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. .
๊ฐ์ฅ ์ข์ ์ ์์ ์๋์ง๋ง ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Mathematica์ ์๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค... ๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ์ .#&/@
์
๋๋ค.
:+1: ๋ ํน๋ณํ ๋์๋ฌธ์์ ๋ ๋ง์ ์ผ๋ฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ํด ~
๋ฐ .~
์ ๋ํด ์ ์ํ ์๋ฏธ๊ฐ ๋์๊ฒ ๋ฉ์ง๊ฒ ๋ณด์
๋๋ค.
+1 ํ ๋.
@tkelman ๋ช
ํํ ํ์๋ฉด , ์๋ฅผ ๋ค์ด sin(0.5 * abs2(a-b))
๋ฅผ ์์ ํ ๋ฒกํฐํ๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
์ดํด์ ํจ๊ป, ์๋ง๋. ์ค์ ๋งต์ด varargs ๋๋ ์ ์๋ฆฌ์์ ์๋ํ์ง ์์ ๊ฒ์ด๋ฏ๋ก ์์ ๊ตฌ๋ฌธ ๊ฐ๋ฅ์ฑ์ด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ ๋ชปํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ต๋๋ค. :-/
์ง๊ธ๊น์ง sin(0.5 * abs2(a-b)) over (a, b)
๊ตฌ๋ฌธ(๋๋ ์ค์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๋ณํ)์ด ๊ฐ์ฅ ๋งค๋ ฅ์ ์
๋๋ค.
์ด๋ฒ ํธ์ ์ ๋ชฉ์ " map(func, x)
์ ๋์ฒด ๊ตฌ๋ฌธ"์
๋๋ค. ์ค์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์์๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ๋งต/๋ฃจํ ์ตํฉ์ ํด๊ฒฐํ์ง ๋ชปํ์ง๋ง ๊ตฌ๋ฌธ๋ณด๋ค ํจ์ฌ ๋ ๊ด๋ฒ์ํ๊ณ ๊ด๋ จ์ด ์์ง๋ง ๊ธฐ์ ์ ์ผ๋ก ๋ณ๋์ ๋ฌธ์ ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์, @tkelman ์ ๋์ํฉ๋๋ค. ์์ ์ map
์ ๋ํ ๋์ฒด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ฏ๋ก \mapsto
, โฆ
์ฌ์ฉ์ ์ ์ํ์ต๋๋ค. @nalimilan์ด ์ธ๊ธํ ๊ฒ์ ๋ค๋ฅธ ๋ฌธ์ IMHO, How to fully vecotrize expressions
์ ๋ ๊ด๋ฒ์ํ๊ณ ๋ ์ ํฉํ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
<rambling>
์ด ๋ฌธ์ ๋ ํ์ฌ 1๋
์ด์ ์ง์๋์ด ์ค๊ณ ์์ต๋๋ค(ํ์ฌ ๋ค๋ฅธ ๋ง์ ๋ฌธ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฌดํ์ ๊ณ์๋ ์ ์์)! ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ง๊ธ Alternative syntax for map(func, x)
๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค . ยฑ450๋ช
์ ์ค๋ฆฌ์ ๊ธฐ๊ณ ์ ์ค ๋จ 41๋ช
๋ง์ด ์ด ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์๊ณ ์๊ฒฌ์ ๊ธฐ๊บผ์ด ๊ณต์ ํ ์ ์์์ต๋๋ค(github ๋ฌธ์ ์๋ ๋ง์ ์์ด์ง๋ง ์ด ๊ฒฝ์ฐ์๋ ๋ถ๋ช
ํ ์ถฉ๋ถํ์ง ์์). ๋์ฒด๋ก ๊ทธ๋ค์ง ๋ค๋ฅธ ์ ์์ด ์์ต๋๋ค. (๋์ผํ ๊ฐ๋
์ ์ฌ์ํ ๋ณํ์ด ์๋๋๋ค).
์ค๋ฌธ์กฐ์ฌ/์ค๋ฌธ์กฐ์ฌ(:์ถฉ๊ฒฉ:)๋ฅผ ๋ง๋๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง ์๊ฑฐ๋ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ ๋ถ๋ค์ด ๊ณ์๋ค๋ ๊ฒ์ ์๋๋ค. ํ์ง๋ง ์ ๋ ์ด๋ฐ ์ผ์ ๋ํด ๋๊ตฌ์ ํ๋ฝ๋ ๋ฐ์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ๊ทธ๋ ๊ฒ ํ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ์ ์์
๋คํธ์ํฌ ๋ฐ ๋ค๋ฅธ ์ปค๋ฎค๋ํฐ์์ ์ต๋ํ์ ํ์ฉ์ ํ์ง ์๋ ๊ฒ์ด ์ข ์ํ๊น์ต๋๋ค. ๋ํ ์ฐ๋ฆฌ๊ฐ ๊ทธ ๊ฐ์น๋ฅผ ๋ณด์ง ๋ชปํ๋ค๋ ๊ฒ์ด ๋์ฑ ์ํ๊น์ต๋๋ค. ๋ ๋ค์ ํ๊ณ ์ ์ ํ ์๊ฒฌ์ ์์งํ ์ ์๋์ง, ์๋๋ฉด ์ต์ํ ํ์ธ์ ํด๋ณด์. ์คํ์ผ๋ก ์ด ํน์ ๋ฌธ์ ์ ๋ํ ํ์ฌ ์๊ฒฌ์ ๋ํด ๋๋ค์๊ฐ ์ด๋ป๊ฒ ๋๋ผ๋์ง ํ์ธํ๊ณ ์ด๋ป๊ฒ ์งํ๋๋์ง ํ์ธํ์ญ์์ค. ์ด์ฉ๋ฉด ์ ๋ง ์ธ๋ชจ๊ฐ ์์ ์๋ ์๊ณ , ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค. ์ ๋ง ์ ์ ์๋ ๋ฐฉ๋ฒ์ ํ ๊ฐ์ง๋ฟ์
๋๋ค.
</rambling>
@Ismael-VC: ์ ๋ง ์ค๋ฌธ์กฐ์ฌ๋ฅผ ํ๊ณ ์ถ๋ค๋ฉด ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ๋ฌป๊ณ ์ถ์ ์ง๋ฌธ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ์ฌ๋์ด ์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ๊ณ ๋ ผ์ ๋์์ด ๋ ์ต์ ์ ๊ฐ๋ณ์ ์ผ๋ก ์์ฝํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ ์๋ ์์ต๋๋ค.
map(func, x)
๋ map(v -> sin(0.5 * abs2(v)), x)
์ ๊ฐ์ ๊ฒ๋ ๋ค๋ฃน๋๋ค. ์ด๊ฒ์ด ์ด ์ค๋ ๋์์ ๋
ผ์ํ ๋ด์ฉ์
๋๋ค. ์์์ ๋
ผ์ํ ๋ชจ๋ ์ ์์ ์ผ๋์ ๋๋ ๊ฒ์ด ๋ ์ด๋ ค์ธ ์ ์์ผ๋ฏ๋ก ์ด๊ฒ์ ๋ค๋ฅธ ์ค๋ ๋๋ก ์ฎ๊ธฐ์ง ๋ง์๋ค.
map
๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ค๋ฆญ ํจ์๋ฅผ ์ ์ฉํ๋ ๊ฐ๋จํ ๊ฒฝ์ฐ์ ๋ํด ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐ๋ํ์ง๋ ์์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ ๋์ ๊ทธ๋ฆผ์ ๋์์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์๋ค๋ฉด ๋ฌธ์ ๋ ์ด๋ฏธ ์ค๋์ ์ ํด๊ฒฐ๋์์ ์ ์์ต๋๋ค.
@Ismael-VC ์ฌ๋ก ์กฐ์ฌ๋ ์ฌ๊ธฐ IMHO์ ๋์์ด ๋์ง ์์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ์๋ฃจ์ ์ค ์ด๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์์ง ์ฐพ์ผ๋ ค๊ณ ํ๋ ๊ฒ์ด ์๋๋ผ ์๋ฌด๋ ์ค์ ๋ก ์ฐพ์ง ๋ชปํ ์๋ฃจ์ ์ ์ฐพ๋ ๊ฒ์ ๋๋ค. ์ด ํ ๋ก ์ ์ด๋ฏธ ๊ธธ๊ณ ๋ง์ ์ฌ๋๋ค์ด ์ฐธ์ฌํ๊ณ ์์ผ๋ฏ๋ก ๋ ์ถ๊ฐํ๋ ๊ฒ์ด ๋์์ด ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@Ismael-VC ๊ด์ฐฎ์ต๋๋ค. ๋ถ๋ด ์์ด ์ค๋ฌธ์กฐ์ฌ๋ฅผ ํ์ธ์. ์ฌ์ค ์ ๋ ๊ณผ๊ฑฐ์ ๋ฌธ์ ์ ๋ํด ๋ช ๊ฐ์ง ๊ธฐ๋ ์ผ ๋ก๊ณ ํฌํ๋ฅผ ํ์ต๋๋ค(์: http://doodle.com/poll/s8734pcue8yxv6t4). ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๋ฌธ์ ์ค๋ ๋์์ ๋ ผ์ํ๋ ๊ฒ๋ณด๋ค ํฌํ์์ ํฌํํ๋ ์ฌ๋๊ณผ ๊ฐ๊ฑฐ๋ ๋ ์ ์ ์์ ๋๋ค. ๋งค์ฐ ๊ตฌ์ฒด์ ์ด๊ณ ์ข ์ข ํผ์์ ์ธ/๊ตฌ๋ฌธ ๋ฌธ์ ์ ์ ํฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ด ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ด ๊ธฐ์กด ์ต์ ์ค์์ ์ ํํ๋ ๊ฒ๋ฟ์ธ๋ฐ ์ด๋ป๊ฒ ์ค๋ฌธ์กฐ์ฌ๊ฐ ์ฐธ์ ํ ์์ด๋์ด๋ฅผ ์์ฑํ ์ ์๊ฒ ์ต๋๊น?
๋ฌผ๋ก ์ด ๋ฌธ์ ์ ์ค์ ๋ชฉํ๋ ์์์ ์ผ๋ก ๋ฒกํฐํ๋ ํจ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์
๋๋ค. ์ด๋ก ์ map
๊ตฌ๋ฌธ์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค. ์๋ํ๋ฉด ์ด๋ฌํ ๋ชจ๋ ํจ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ map
๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด๋ฅผ ์ํด ๊ธฐ์กด์ ์ํ ํ๊ธฐ๋ฒ์ ์ฐพ์๋ณด์์ง๋ง, ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๊ธฐ์๋ ์ฐ์ฐ์ด ๋๋ฌด ์ค์ํ์ง ์๋ค๋ ์๊ฒฌ์ ๋ณด๋ ๊ฒฝํฅ์ด ์์ต๋๋ค! ์ํ์ ๋งฅ๋ฝ์์ ์์์ ํจ์์ ๊ฒฝ์ฐ ๋๋ ์ด๊ฒ์ ๊ฑฐ์ ๋ฏฟ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ ๋ช ๊ฐ์ง ์ผ๋ฐํ๊ฐ ์๋ Hadamard ์ ํ ํ๊ธฐ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค. https://en.wikipedia.org/wiki/Hadamard_product_ (matrix)#Analogous_Operations
@rfourquet ์ด ์ ์ํ ๋๋ก sinโx
๊ฐ ๋จ์ต๋๋ค. ์ ๋์ฝ๋๊ฐ ํ์ํ๊ณ ์ด์จ๋ ๋๋ฆฌ ์๋ ค์ ธ ์์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ๋์์ด ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@nalimilan , sin(0.5 * abs2(a-b)) ~ (a,b)
ํ๋ฉด map((a,b)->sin(0.5 * abs2(a-b)), (a,b))
๋ก ๋ณํ๋ฉ๋๋ค. ๊ทธ๊ฒ์ด ๋ง๋์ง๋ ํ์คํ์ง ์์ง๋ง ํจ๊ณผ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๋ํ let-me-give-you-a-huge-complexed-expression-and-you-perfectly-auto-vectorize-it-for-me ๋ฌธ์ ์ ๋ํด ๋๋ฌด ๋ง์ด ํ๊ตฌํ๋ ๊ฒ์ ๊ฒฝ๊ณํฉ๋๋ค. ์ด์ ๊ด๋ จํ์ฌ ๊ถ๊ทน์ ์ธ ์๋ฃจ์
์ ์/์์
+ ์ฟผ๋ฆฌ ๊ณํ ๋ฑ์ DAG๋ฅผ ์์ ํ ๊ตฌ์ถํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง map
์ ๋ํ ํธ๋ฆฌํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํฐ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@quinnj ๋ค, ์ด๊ฒ์ ์ค์ ์ฐ์ฐ์๋ฅผ ์ ์ธํ๊ณ ๋ณธ์ง์ ์ผ๋ก ์์์ ์ ์ํ over
๊ตฌ๋ฌธ์
๋๋ค.
์ง์งํ ์๊ฒฌ: SQL์ ๋ณธ์ง์ ์ผ๋ก ํ ๋จ์ "๋ฒกํฐํ"๋ฅผ ํตํด ์ ์ฉ๋๋ ๋ง์ ๋ณ์์ ์์ ๋จ์ ํจ์๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์ด ์์ด๋์ด๋ฅผ ์ถฉ๋ถํ ์ถ๊ตฌํ๋ค๋ฉด SQL์ ๋ค์ ๋ฐ๋ช ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
@johnmyleswhite ๋์, DSL ์ผ๋ช Linq์ฒ๋ผ ๋ณด์ด๊ธฐ ์์
์ค๋ ๋ ๊ฒ์ ์ฃผ์ ์์ |> 'ํ์ดํ' ์ฐ์ฐ์๋ฅผ ์ ๋ฌธํํ๊ณ ์ง๋ ์คํ์ผ ๊ธฐ๋ฅ์ ์ป์ ์ ์์ต๋๋ค. ํจ์๋ฅผ ๋ฐ์ดํฐ์ ํ์ดํ๋ก ์ฝ์ ์ ์์ต๋๋ค. ์ถ๊ฐ ๋ณด๋์ค๋ก ๋์ผํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ ๊ตฌ์ฑ์ ์ํํ ์ ์์ต๋๋ค.
julia> (|>)(x::Function, y...) = map(x, y... )
|> (generic function with 8 methods)
julia> (|>)(x::Function, y::Function) = (z...)->x(y(z...))
|> (generic function with 8 methods)
julia> sin |> cos |> [ 1,2,3 ]
3-element Array{Float64,1}:
0.514395
-0.404239
-0.836022
julia> x,y = rand(3), rand(3)
([0.8883630054185454,0.32542923024720194,0.6022157767415313], [0.35274912207468145,0.2331784754319688,0.9262490059844113])
julia> sin |> ( 0.5 *( abs( x - y ) ) )
3-element Array{Float64,1}:
0.264617
0.046109
0.161309
@johnmyleswhite ๊ทธ๊ฑด ์ฌ์ค์ด์ง๋ง ๊ฝค ๊ฒธ์ํ ๊ฐ์น ์๋ ์ค๊ฐ ๋ชฉํ๊ฐ ์์ต๋๋ค. ๋ด ์ง์ ์์ ๋ค์ค ์ฐ์ฐ ๋ฒกํฐํ๋ ํํ์์ map
๋ฒ์ ์ ์ด๋ฏธ ์ง๊ธ๋ณด๋ค ๋ ๋น ๋ฆ
๋๋ค. ๋ฐ๋ผ์ ์ํํ๊ฒ ์ ํํ๋ ๋ฐฉ๋ฒ์ ํ์
ํ๋ ๊ฒ์ด ๋ค์ ์๊ธํฉ๋๋ค.
@johnmyleswhite ํ์คํ์ง ์์ต๋๋ค. ๋ง์ SQL์ด ํ ์ ํ, ์ ๋ ฌ ๋ฐ ๋ณํฉ์ ๊ดํ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์๋ ์์๋ณ๋ก ํจ์๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๋ํด์๋ง ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ SQL์ ์์๋ณ ์ฐ์ฐ(์: >
, LN
)๊ณผ ๊ฐ์(์: SUM
)๋ฅผ ๊ตฌ๋ณํ๋ ๊ตฌ๋ฌธ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ํ์๋ ํ์ฌ Julia์์์ ๊ฐ์ด ๋จ์ํ ์๋์ผ๋ก ๋ฒกํฐํ๋ฉ๋๋ค.
@JeffBezanson \circ
์ฌ์ฉ์ ์ฅ์ ์ ์ธ๋ฑ์ค ์งํฉ์ ์ธ๋ฑ์ค ์งํฉ์ ํจ์๋ก ํด์ํ๋ฉด(ํ์ค ์ํ์ "๊ตฌํ") ๋งคํ์ด _is_ ๊ฐ๋จํ๊ฒ ๊ตฌ์ฑ๋๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ (sin โ x)(i)=sin(x(i))
, ๋๋ ์คํ๋ ค sin(x[i])
.
@mdcfrancis ๊ฐ ์ธ๊ธํ๋ฏ์ด ํ์ดํ์ ์ฌ์ฉ์ ๋ณธ์ง์ ์ผ๋ก ์ํ์์ (๋๋ ํนํ ๋ฒ์ฃผ ์ด๋ก ์ CS ์์ฉ ํ๋ก๊ทธ๋จ) ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ์ข ์ข ์ํ๋๋ "๋ค์ด์ด๊ทธ๋จ ์์" ๊ตฌ์ฑ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ํ์ดํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ฌผ๋ก ์ด์์์ ๋๋ค.
์ด๋ฌํ ๊ตฌ์ฑ ์ฐ์ฐ์ ์ค ์ด๋ ๊ฒ๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ๋ค๋ฅธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ต์ํ ์ผ๋ถ ์ ์๋ ์ถ์ ํ์ดํ/๋ชจํผ์ฆ ๊ตฌ์ฑ์ ๋ฎ์ \cdot
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ดํ์ ๊ทธ๋ฃนํ(๋ค์ ์ ๊ฒ)์ "๊ณฑ์
"์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ASCII ์๋ ๋ก๊ทธ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ: ์ค์ ๋ก ๊ณฑ์ ์ ๋ํ๋ด๊ธฐ ์ํด ๋ง์นจํ๋ฅผ ์ฌ์ฉํ๋ ์ ์๋ ์์ต๋๋ค. (๋๋ ๊ทธ๊ฒ์ ์๊ณก์๋ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณด์์ ์๋ ์์ต๋๋ค. ๊ธฐ์ต์ด ๋์ง ์์ต๋๋ค.)
๋ฐ๋ผ์ sin . x
... ํ์ง๋ง ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค.
์ฌ์ ํ ... ๋ง์ง๋ง ๋น์ ๋ ์ ๋ง ์ด๊ธฐ ์ ์ ์ค ํ๋, ์ฆ sin.(x)
์ ๋ํ ์ฃผ์ฅ์ผ ์ ์์ต๋๋ค. (์๋๋ฉด ๋๋ฌด ๋น์ฐํ ์๊ธฐ์ผ ์๋ ์์ต๋๋ค.)
๋ค๋ฅธ ๊ฐ๋์์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ ์์ง ๋ง์ธ์.
..
๋ฅผ collect(..(A,B)) == ((a[1],..., a[n]), (b[1], ...,b[n])) == zip(A,B)
๋ก ์ ์ํ๋ฉด T[x,y,z] = [T(x), T(y), T(z)]
๋ฅผ ๊ณต์์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ค์์ด ์ฑ๋ฆฝํฉ๋๋ค.
map(f,A,B) = [f(a[1],b[1]), ..., f(a[n],b[n])] = f[zip(A,B)...] = f[..(A,B)]
์ด๋ ๋ฐฐ์ด ๊ตฌ์ฑ์ ์ํ ๊ตฌ๋ฌธ์ ๋ฐฉํดํ์ง ์๋ ์ ์ด๋ ํ๋์ ๋งต ๊ตฌ๋ฌธ์ ๋๊ธฐ๋ฅผ ๋ถ์ฌํฉ๋๋ค. ::
๋๋ table
ํ์ฅ ํ๋ก๊ทธ๋จ f[::(A,B)] = [f(a[i], b[j]) for i in 1:n, j in 1:n]
์ ์ ์ด๋ ๋ ๋ฒ์งธ ํฅ๋ฏธ๋ก์ด ์ฌ์ฉ ์ฌ๋ก๋ก ์ด์ด์ง๋๋ค.
์ง๋ฌธํ๋ ค๋ ์ง๋ฌธ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ์ญ์์ค.
@toivoh ๊ฐ์ฌํฉ๋๋ค. ์ ๋ ํ์ฌ ์ฌ๋ฌ ์ค๋ฌธ์กฐ์ฌ/์ค๋ฌธ์กฐ์ฌ ์ํํธ์จ์ด๋ฅผ ํ๊ฐํ๊ณ ์์ต๋๋ค. ๋ํ ๋๋ ์ ํธํ๋ ๊ตฌ๋ฌธ ์ ๋ํด์๋ง ํด๋งํ ๊ฒ์ ๋๋ค. ์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ๊ณ ์ถ์ ์ฌ๋๋ค์ ๊ทธ๋ฅ ๊ทธ๋ ๊ฒ ํ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ๋๊ตฌ๋ ๊ทธ๋ ๊ฒ ํ๋ ๋ฐ ๊ด์ฌ์ด ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ์ง ๋ง์.
์๋ฌด๋ ์ค์ ๋ก ์ฐพ์ง ๋ชปํ ํด๊ฒฐ์ฑ ์ ์ฐพ์ผ์ญ์์ค
@nalimilan ์ฐ๋ฆฌ ์ค์ ์๋ฌด๋ ์์ต๋๋ค. :์๋ค:
๋น์ ์ด ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ด ๊ธฐ์กด ์ต์ ์ค์์ ์ ํํ๋ ๊ฒ๋ฟ์ธ๋ฐ ์ด๋ป๊ฒ ์ค๋ฌธ์กฐ์ฌ๊ฐ ์ฐธ์ ํ ์์ด๋์ด๋ฅผ ์์ฑํ ๊ฒ์ ๋๊น?
์ด์ ์ค๋ ๋์์ ํ ๋ก ํ๋ ๊ฒ๋ณด๋ค ํฌํ์์ ํฌํํ๋ ์ฌ๋๊ณผ ๊ฐ๊ฑฐ๋ ๋ ์ ์ ์ฌ๋๋ค์ด ์์ต๋๋ค.
@JeffBezanson ์ด๋ฏธ ์ค๋ฌธ์กฐ์ฌ๋ฅผ ํ์ จ๋ค๋ ๊ธฐ์ฉ๋๋ค. ๊ณ์ ์งํํ์ธ์!
sinโx
์ ๋์ฝ๋๊ฐ ํ์ํ๊ณ ๋๋ฆฌ ์๋ ค์ ธ ์์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ๋์์ด ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ ๋์ฝ๋๊ฐ ๋๋ฌด ๋ง์์ ์ฌ์ฉํฉ์๋ค. ํญ ์์ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ์ข์ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ๊ทธ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ชป๋ ์ ์ ๋ฌด์์ ๋๊น?, ๋ชจ๋ฅด๋ฉด ๋ฌธ์ํํ๊ณ ๊ต์กํฉ์๋ค. ์กด์ฌํ์ง ์์ผ๋ฉด ๋ฌด์์ด ๋ฌธ์ ์ ๋๊น? ๊ทธ๊ฒ์ ๋ฐ๋ช ? ๋ค๋ฅธ ์ฌ๋์ด ๊ทธ๊ฒ์ ๋ฐ๋ช ํ๊ณ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ฌ ์ ๋ก๋ก ๋ฐ์๋ค์ธ ํ์์ผ ๊ณ ๋ คํ ์ ์๋๋ก ์ฐ๋ฆฌ๊ฐ ์ ๋ง๋ก ๊ธฐ๋ค๋ ค์ผ ํฉ๋๊น?
โ
๋ ์ ๋ก๊ฐ ์๋๋ฐ ๋ฌธ์ ๋ ์ ๋์ฝ๋์ธ๊ฐ์? ์์? ๊ทธ๋ฌ๋ฉด ๋๋ฆฌ ์๋ ค์ง์ง ์์ ๋๋จธ์ง ์ ๋์ฝ๋๋ฅผ ์ธ์ ์ฌ์ฉํ๊ธฐ ์์ํฉ๋๊น? ์ ๋?
๊ทธ ๋ ผ๋ฆฌ์ ๋ฐ๋ฅด๋ฉด Julia๋ ์ด์จ๋ ๋๋ฆฌ ์๋ ค์ ธ ์์ง ์์ง๋ง ๋ฐฐ์ฐ๊ณ ์ถ์ ์ฌ๋์ ์ ๊ฒ์ ๋๋ค. ๋ด ๋งค์ฐ ๊ฒธ์ํ ์๊ฒฌ์ผ๋ก๋ ๋์๊ฒ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ถฉ๋ถํ ๊ณตํํฉ๋๋ค. ์ ๋ โ
์ ์ ์ ์ผ๋ก ๋ฐ๋ํ์ง ์์ต๋๋ค. ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ ๋์ฝ๋๋ฅผ ์๊ตฌํ๋ ๊ฒ์ ์ด์ ๋ํ ํ๋์ ํ์์ผ ๋ฟ์
๋๋ค. ์์ ํ ๊ฐ๋ผ์ํ ๋งํผ ์ถฉ๋ถํ์ง๋ ์์ต๋๋ค.
*
๋ฅผ ASCII ๋์์ผ๋ก ์ฌ์ฉ/์ค๋ฒ๋ก๋ํ๋ ๊ฒ์ ์์ ํ ๋ฏธ์น ์ง์
๋๊น? ์ํ์ ์ผ๋ก ์ด๋ ์ ๋ ์๋ฏธ๊ฐ ์๋ค๊ณ ์ฃผ์ฅํ ์๋ ์์ง๋ง ๋๋๋ก ๊ทธ ์๋ฏธ๋ฅผ ์๋ณํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค... (๋ค์, map
๊ธฐ๋ฅ์ผ๋ก ์ ํ๋๋ฉด map
๋ ์ด๋ฏธ ASCII ๋์์
๋๋ค. ์๋์?)
\circ
์ฌ์ฉ์ ์ฅ์ ์ ์ธ๋ฑ์ค ์งํฉ์ ์ธ๋ฑ์ค ์งํฉ์ ํจ์๋ก ํด์ํ๋ฉด(ํ์ค ์ํ์ "๊ตฌํ") ๋งคํ์ด _is_ ๊ฐ๋จํ๊ฒ ๊ตฌ์ฑ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ์ด๊ฒ์ ์๋์ง ํ์ ์ด ์์ง ์๋๋ค.
@hayd ์ด๋ ๋ถ๋ถ์ธ๊ฐ์? ์ธ๋ฑ์ฑ๋ ํจ๋ฐ๋ฆฌ(์: ์ํ์ค)๋ ์ธ๋ฑ์ค ์ธํธ์ ํจ์๋ก ๋ณผ ์ ์์ต๋๊น? ์๋๋ฉด ์ด์ ๋ํ ๋งคํ์ด ๊ตฌ์ฑ์ด ๋ฉ๋๊น? ์๋๋ฉด ์ด๊ฒ์ด ์ด ๊ฒฝ์ฐ์ ์ ์ฉํ ๊ด์ ์ ๋๊น?
์ฒ์ ๋ ๊ฐ์ (์ํ์ ) ์์ ์ ๋ ผ์์ ์ฌ์ง๊ฐ ๊ฑฐ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง, ์, ์ฌ๊ธฐ์์ ์ด๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๋ ฅํ๊ฒ ์นํธํ์ง๋ ์์ ๊ฒ์ ๋๋ค. ๋๋ถ๋ถ "์, ๊ทธ ์ ๋๊ฐ ์ ๋นํฉ๋๋ค!"์์ต๋๋ค. ๋ฐ์.
@mlhetland |>๋ ->์ ๋งค์ฐ ๊ฐ๊น๊ณ ์ค๋๋ ์๋ํฉ๋๋ค. ๋ํ ์ฌ๋ฐ๋ฅธ ์ฐ๊ด์ด๋ผ๋ '์ฅ์ '์ด ์์ต๋๋ค.
x = parse( "sin |> cos |> [1,2]" )
:((sin |> cos) |> [1,2])
@mdcfrancis ๋ฌผ๋ก ์
๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ด๊ฐ ๋จธ๋ฆฌ์ ์์ฝํ ๊ตฌ์ฑ ํด์์ ๋ค์ง์ต๋๋ค. ์ฆ, sinโx
๋ x |> sin
, ์๋์?
์ถ์ : ์๋ง๋ "๋์ํ"์์ ๊ธธ์ ์์์ ์๋ ์์ง๋ง f[x,y,z]
๊ฐ [f(x),f(y),f(z)]
๊ฐ ๋๋๋ก ํ์ํ๋ ๋ฐฐ์ด ๊ตฌ์ฑ T[x,y,z]
์์ ํจ์๋ฅผ ํ์ฉํ๋ฉด ์ง์ ์ ๊ณตํฉ๋๋ค.
map(f,A) == f[A...]
์๋นํ ์ฝ๊ธฐ ์ฝ๊ณ ๊ตฌ๋ฌธ์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
๋๋ํ๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์๋์ํฌ ์ ์๋ค๋ฉด sin[x...]
๋ sin(x)
๋๋ sin~x
๋ฑ์ ์์ธํ ์ ๋ณด๋ฅผ ์์ด๋ฒ๋ฆด ๊ฒ ๊ฐ์ต๋๋ค.
[sin xs]
๊ตฌ๋ฌธ์ ์ด๋ป์ต๋๊น?
์ด๊ฒ์ ๋ฐฐ์ด ์ดํด [sin(x) for x in xs]
์ ๊ตฌ๋ฌธ์ด ์ ์ฌํฉ๋๋ค.
@mlhetland ์ฃ |> x === ๋งต( ์ฃ, x )
๊ทธ๊ฒ์ ํ์ฌ ๊ธฐ๋ฅ ์ฒด์ธ ์๋ฏธ ์ ์ญ์์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ ์ฐ์ฐ์์ ๋ํ ๋ ๋์ ์ฉ๋๋ฅผ ์ฐพ๋ ๋ฐ ์ ๊ฒฝ ์ฐ์ง ์๊ฒ ์ง๋ง ์ ํ ๊ธฐ๊ฐ์ด ํ์ํฉ๋๋ค.
@mdcfrancis ์, ๊ทธ๊ฒ์ด ๋น์ ์ด ๋ชฉํ๋ก ํ๋ ๊ฒ์์ ์์์ต๋๋ค. @tkelman์ด ๋ฐ๋ณตํ๋ ๊ฒ์ฒ๋ผ wrt๋ฅผ ๋ค์ง์ต๋๋ค. ๋ด๊ฐ ์ค๋ช ํ ๊ตฌ์ฑ ํด์.
๋ฒกํฐํ์ ์ฒด์ด๋์ ํตํฉํ๋ ๊ฒ์ ๊ฝค ๋ฉ์ง ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋จ์ด๊ฐ ๊ฐ์ฅ ๋ช
ํํ ์ฐ์ฐ์์ธ์ง ๊ถ๊ธํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒ:
[1, 2] mapall
+([2, 3]) map
^(2, _) chain
{ a = _ + 1
b = _ - 1
[a..., b...] } chain
sum chain
[ _, 2, 3] chain
reduce(+, _)
ํ ํ์ ์๋ ์ฌ๋ฌ ๋งต์ ๋จ์ผ ๋งต์ผ๋ก ์๋ ๊ฒฐํฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ํ ์ง๋์ ์ผ์ข ์ ์๋ ๋ฐฉ์ก ๊ธฐ๋ฅ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์์ ๋ถ๋ถ์์ [1, 2]๋ฅผ _๋ก ๋ฐ๊พธ๋ฉด ๋์ ์ต๋ช ํจ์๋ฅผ ๋น๋ํ ์ ์์ต๋๋ค. ์ฐธ๊ณ ๋๋ ์ฐ๊ฒฐ์ ์ํด R์ magrittr ๊ท์น์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค(์ฐ๊ฒฐ ์ค๋ ๋์์ ๋ด ๊ฒ์๋ฌผ ์ฐธ์กฐ).
์๋ง๋ ์ด๊ฒ์ DSL์ฒ๋ผ ๋ณด์ด๊ธฐ ์์ํ์ ๊ฒ์ ๋๋ค.
๋๋ ์ด ๋ฌธ์ ๋ฅผ ์ค๋ซ๋์ ์ถ์ ํด ์์ผ๋ฉฐ ์ง๊ธ๊น์ง ์ธ๊ธํ์ง ์์์ง๋ง ์ด๊ฒ์ IMHO์ ์์์ ๋ฒ์ด๋๊ธฐ ์์ํ์ต๋๋ค.
๋๋ map์ ๋ํ ๊นจ๋ํ ๊ตฌ๋ฌธ์ด๋ผ๋ ์์ด๋์ด๋ฅผ ๊ฐ๋ ฅํ๊ฒ ์ง์งํฉ๋๋ค. ์ ๋ @tkelman ์ ~
์ ์์ด ์ด๋ฌํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ํด ASCII ๋ด์์ ์ ์ง๋๋ ๊ฒ์ ๊ฐ์ฅ ์ข์ํ๊ณ sin~x
์ ์์ฃผ ์ข์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์์ ๋
ผ์ํ ๋ฐ์ ๊ฐ์ด ๋งค์ฐ ์ ๊ตํ ํ ์ค์ง๋ฆฌ ์คํ์ผ ๋งคํ์ด ๊ฐ๋ฅํฉ๋๋ค. sinโx
๋ฅผ ์ฌ์ฉํด๋ ๊ด์ฐฎ์ต๋๋ค. ๋ ๋ณต์กํ ๊ฒ์ ๊ฒฝ์ฐ ์ ์ ํ ๋ฃจํ๊ฐ ํจ์ฌ ๋ ๋ช
ํํ๋ค๊ณ ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค(์ผ๋ฐ์ ์ผ๋ก ์ต์์ ์ฑ๋ฅ). ๋๋ ๋๋ฌด ๋ง์ '๋ง๋ฒ ๊ฐ์' ๋ฐฉ์ก์ ์ข์ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฝ๋๋ฅผ ๋ฐ๋ผ๊ฐ๊ธฐ ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋ช
์์ ๋ฃจํ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ช
ํํฉ๋๋ค.
๊ทธ๊ฒ์ ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด์๋ ์ ๋๋ค๋ ๋ง์ ์๋์ง๋ง, ํนํ ๋งค์ฐ ๋นจ๋ผ์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฒฐํ map
๊ตฌ๋ฌธ์ ๋จผ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค( jb/functions
๋ถ๊ธฐ์ ๋ํ ๋ด ํ
์คํธ์์) .
jb/functions์ ํจ๊ณผ ์ค ํ๋๋ broadcast(op, x, y)
๊ฐ op
์ ๋ํ ๋ฐฉ์ก์ ์๋์ผ๋ก ์ ๋ฌธํํ ์ฌ์ฉ์ ์ ์ ๋ฒ์ x .op y
๋งํผ ์ข์ ์ฑ๋ฅ์ ๊ฐ๋๋ค๋ ๊ฒ์
๋๋ค.
๋ ๋ณต์กํ ๊ฒ์ ๊ฒฝ์ฐ ์ ์ ํ ๋ฃจํ๊ฐ ํจ์ฌ ๋ ๋ช ํํ๋ค๊ณ ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค(์ผ๋ฐ์ ์ผ๋ก ์ต์์ ์ฑ๋ฅ). ๋๋ ๋๋ฌด ๋ง์ '๋ง๋ฒ ๊ฐ์' ๋ฐฉ์ก์ ์ข์ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฝ๋๋ฅผ ๋ฐ๋ผ๊ฐ๊ธฐ ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋ช ์์ ๋ฃจํ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ช ํํฉ๋๋ค.
๋์ํ์ง ์์ต๋๋ค. exp(2 * x.^2)
๋ ์๋ฒฝํ๊ฒ ์ฝ์ ์ ์์ผ๋ฉฐ [exp(2 * v^2) for v in x]
๋ณด๋ค ๋ ์ฅํฉํฉ๋๋ค. ์ฌ๊ธฐ์ IMHO์ ๋ฌธ์ ๋ ์ ์(๋ณต์ฌ๋ณธ์ ํ ๋นํ๊ณ ์์
์ ์ตํฉํ์ง ์์)๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ฌ ์ฌ๋๋ค์ ๊ฐ๋๋ ๊ฒ์ ํผํ๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ์ํด ๋๋ฆฐ ํ์์ด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ์ ์๋๋ก ์ถฉ๋ถํ ์งง์ ๊ตฌ๋ฌธ์ ์ฐพ์์ผ ํฉ๋๋ค.
๋ ๋ง์ ์๊ฐ. ํจ์๋ฅผ ํธ์ถํ ๋ ํ ์ ์๋ ๋ช ๊ฐ์ง ๊ฐ๋ฅํ ์์ ์ด ์์ต๋๋ค.
์ธ์ ์์ด ๋ฃจํ(์ฒด์ธ)
์ฐ๊ฒฐ๋ ์ธ์๋ง ๋ฐ๋ณตํฉ๋๋ค(๋งต).
๋ชจ๋ ์ธ์๋ฅผ ํตํด ๋ฃจํ(mapall)
์์ ๊ฐ ํญ๋ชฉ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ณตํ ํญ๋ชฉ ํ์(~)
๋ฐ๋ณต๋์ง ์๋ ํญ๋ชฉ ํ์([ ]์ ์ถ๊ฐ ์ธํธ)
ํตํฉํ ์ ์๋ ํญ๋ชฉ์ ๊ตฌ๋ฌธ์ ๋ฌด์ํ๊ณ ์๋์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
๋ฐ๋ณต๋๋ ์ธ์๊ฐ ๋ ๊ฐ ์ด์ ์๋ ๊ฒฝ์ฐ ์ฑ๊ธํค ์ฐจ์ ํ์ฅ์ด ์๋์ผ๋ก ๋ฐ์ํด์ผ ํฉ๋๋ค.
๋ฐฉ์ก์ ์ฐจ์์ด ์์์ ๋๋ง ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ๋ถ์ผ์น. ๊ทธ๋์ ๋ฐฉ์กํ์ง ๋ง๋ผ๊ณ ํ๋ฉด
๋์ ์ธ์์ ํฌ๊ธฐ๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๊น?
sin[x...]๋ ์ค์ ๋ก sin(x) ๋๋ sin~x ๋ฑ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์์ต๋๋ค.
๋ํ ๊ณ์ ์๊ฐํด๋ณด๋ฉด sin[x...]
๋งต์ [f(x...)]
์์ ๋ ์ด์ฑ์ ์ธ ๋ฒ์ ์
๋๋ค.
๊ตฌ๋ฌธ
[exp(2 * (...x)^2)]
๋๋ [exp(2 * (x..)^2)]
์ ๊ฐ์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ค์ ์๋ฌต์ ํจ์ ์ฐ๊ฒฐ์ด ๋์
๋๋ฉด ์์ฒด ์ค๋ช
ํฉ๋๋ค.
@nalimilan ๋ค, ํ์ง๋ง ๋ฃจํ ์์ด๋ ๊ด์ฐฎ๋ค๊ณ ๋งํ ๋ด 'ํ ์ค์ง๋ฆฌ' ๋ฒ์ฃผ์ ๋ง์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ชจ๋ ๊ฒ์ ๋์ดํ๋ ๋์: ํ ๋น ๋๋ ๋ณต์ฌ ์์ด ํ ๋นํ ์ ์๋ map
์ ๊ฒฐ๊ณผ๊ฐ ์ ์๊ฒ ํจ์ฌ ๋ ์ค์ํฉ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ์ฌ์ ํ ์ฑ๋ฅ์ ์ค์ํ ์ฝ๋์ ๋ํด ๋ฃจํ๋ฅผ ์ ํธํ๋ ๋ ๋ค๋ฅธ ์ด์ ์ด์ง๋ง, ์ด๊ฒ์ด ์ํ๋ ์ ์๋ค๋ฉด(#249๋ ํ์ฌ ํฌ๋ง์ ์ธ ATM์ผ๋ก ๋ณด์ด์ง ์์) ์ด ๋ชจ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋งค๋ ฅ์ ์
๋๋ค.
ํ ๋น ๋๋ ๋ณต์ฌ ์์ด ํ ๋น ๊ฐ๋ฅํ ๋งต์ ๊ฒฐ๊ณผ
์ด๊ฒ์ ์กฐ๊ธ ํ์ฅํ ์ ์์ต๋๊น? ํ์คํ map
์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฐ map
์ ์ถ๋ ฅ์ ๋ฏธ๋ฆฌ ํ ๋น๋ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ค, ๋ง์ต๋๋ค. ์ด๋ฏธ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ฃ์กํฉ๋๋ค.
์, ๋ฌผ๋ก ์
๋๋ค. ์ฐ๋ฆฌ๋ map!
๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ๋น์ ์ด ๊ด์ฐฐํ ๋ฐ์ ๊ฐ์ด #249๋ ๊ทธ๊ฒ์ ํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ์๊ตฌํ๊ณ ์์ต๋๋ค.
@jtravs ์์ ์๋ฃจ์
์ LazyArray
(https://github.com/JuliaLang/julia/issues/8450#issuecomment-65106563)์ผ๋ก ์ ์ํ์ง๋ง ์ง๊ธ๊น์ง๋ ์ฑ๋ฅ์ด ์ด์์ ์ด์ง ์์์ต๋๋ค.
@toivoh ๊ฒ์ํ ํ ํด๋น ๊ฒ์๋ฌผ์ ์ฌ๋ฌ ๋ฒ ์์ ํ์ต๋๋ค. ๋ด๊ฐ ๊ฑฑ์ ํ๋ ์ง๋ฌธ์ ๋ฐ๋ณตํ ์ธ์์ ๊ทธ๋ ์ง ์์ ์ธ์๋ฅผ ํ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค(๋ฐ๋ผ์ mapall์ด ๋ธ๋ก๋์บ์คํธ๋ณด๋ค ๋ช ํํ ์ ์์). ๋ ์ด์์ ์ธ์๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ ํ์ํ ๊ฒฝ์ฐ ๋น๊ต ๊ฐ๋ฅํ ๋ฐฐ์ด์ ์์ฑํ๊ธฐ ์ํด ์ฑ๊ธํค ์ฐจ์์ ํ์ฅํ๋ ๊ฒ์ด ํญ์ ์ํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ map!
๋ง์ต๋๋ค. ์ฌ๊ธฐ์์ ํด๊ฒฐ๋ ๋ฉ์ง ๊ตฌ๋ฌธ ์คํ์ด ์ด ๊ฒฝ์ฐ๋ ํฌํจ๋๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. x := ...
๊ฐ ์์์ ์ผ๋ก RHS๋ฅผ x
์ ๋งคํํ๋๋ก ํ ์ ์์์ต๋๊น?
๋งคํ๊ณผ ์ฐ๊ฒฐ์ ํตํฉํ๋ ChainMap์ด๋ผ๋ ํจํค์ง๋ฅผ ์ฌ๋ ธ์ต๋๋ค.
๋ค์์ ์งง์ ์์ ๋๋ค.
<strong i="7">@chain</strong> begin
[1, 2]
-(1)
(_, _)
map_all(+)
<strong i="8">@chain_map</strong> begin
-(1)
^(2. , _)
end
begin
a = _ - 1
b = _ + 1
[a, b]
end
sum
end
๋๋ ๊ณ์ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ๊ณ ๋ง์นจ๋ด ๋ฐฐ์ด ์ดํด์์ ํ์๋ ๋ฐฐ์ด์ ๋งคํํ๊ธฐ ์ํ ์ผ๊ด๋๊ณ ์ค๋ฆฌ์ ๊ตฌ๋ฌธ์ ์์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ ์ ์์ ์ด๋ฏธ ํ๋ฆฝ๋ ๋ฐฐ์ด ์ดํด ์ธ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ julian์ ๋๋ค.
f[a...]
๋ถํฐ ์ปจ๋ฒค์
f[a...] == map(f, a[:])
f[a..., b...] == map(f, a[:], b[:])
etc
์๋ก์ด ๊ธฐํธ๋ฅผ ๋์ ํ์ง ์์ต๋๋ค.
2.) ์ด๊ฒ์ ๋ง๋ถ์ฌ, ๋๋ ํ๋์ ์ถ๊ฐ ์ฐ์ฐ์์ ๋์
์ ์ ์ํ ๊ฒ์
๋๋ค: _๋ชจ์ ๋ณด์กด_ ํ๊ธฐ๋ ์ฐ์ฐ์ ..
(๋งํ์๋ฉด). ...
๋ _flat_ ์คํจํ
์ฐ์ฐ์์ด๋ฏ๋ก $ a
๊ฐ n
-์ฐจ์์ด๋๋ผ๋ f[a...]
๋ ๋ฒกํฐ๋ฅผ ๋ฐํํด์ผ ํ๊ณ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ..
๋ฅผ ์ ํํ ๊ฒฝ์ฐ ์ด ์ปจํ
์คํธ์์
f[a.., ] == map(f, a)
f[a.., b..] == map(f, a, b)
๊ฒฐ๊ณผ๋ ์ธ์์ ๋ชจ์์ ์์ํฉ๋๋ค. ๋ฐฉ์ก ํ์ฉ
f[a.., b..] == broadcast(f, a, b)
๋ค์๊ณผ ๊ฐ์ ์๊ฐ์ ์ธ ์ ์์ต๋๋ค.
sum(*[v.., v'..]) == dot(v,v)
ํด๋ ์นด?
์ด๊ฒ์ ๋งคํ ํํ์์ ๋์์ด ๋์ง ์์ต๋๊น? over
๊ตฌ๋ฌธ์ ์ฅ์ ์ค ํ๋๋ ํํ์๊ณผ ํจ๊ป ์๋ํ๋ ๋ฐฉ์์
๋๋ค.
sin(x * (y - 2)) over x, y == map((x, y) -> sin(x * (y - 2)), x, y)
๊ธ์, ๋น์ ์ด ๊ทธ๊ฒ์ ํ์ฉํ๋ ค๋ฉด ์์ [sin(x.. * y..)]
๋๋ sin[x.. * y..]
๋ฅผ ํตํด ๊ฐ๋ฅํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ปจํ
์ด๋๊ฐ ์๋ ์์์ ๋ํ ํจ์ ์ฐ์ฐ์์ ๋ํ ์๊ฐ์ ํํธ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ over ๊ตฌ๋ฌธ๋ณด๋ค ์กฐ๊ธ ๋ ์ข์ํฉ๋๋ค.
๊ทธ๋ฌ๋ x..
๊ฐ x
์ ๋งคํ๋๋๋ก ๋จ์ํํ ์ ์์ต๋๊น? ๋ฐ๋ผ์ @johansigfrids ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
sin(x.. * (y.. - 2)) == map((x, y) -> sin(x * (y - 2)), x, y)
@jtravs ๋ฒ์ ์ง์ ( [println(g(x..))]
๋ println([g(x..)])
) ๋ฐ ์ผ๊ด์ฑ [x..] = x
.
๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ x.. = x[:, 1], x[:, 2], etc.
๋ฅผ ์ ํ ํ์ ๋ฐฐ์ด(์ด)์ ๋ถ๋ถ ํ์๋ก ์ฌ์ฉํ๊ณ ..y
๋ฅผ ํํ ํ์ ๋ฐฐ์ด ..y = y[1,:], y[2,:]
์ ๋ถ๋ถ ํ์๋ก ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๋ ๋ค ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ ๋ง์ ํฅ๋ฏธ๋ก์ด ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
[f(v..)] == [f(v[i]) for i in 1:m ]
[v.. * v..] == [v[i] * v[i] for 1:m]
[v.. * ..v] == [v[i] * v[j] for i in 1:m, j in 1:n]
[f(..A)] == [f(A[:, j]) for j in 1:n]
[f(A..)] == [f(A[i, :]) for i in 1:m]
[dot(A.., ..A)] == [dot(A[:,i], A[j,:]) for i in 1:m, j in 1:n] == A*A
[f(..A..)] == [f(A[i,j]) for i in 1:m, j in 1:n]
[v..] == [..v] = v
[..A..] == A
( v
๋ฒกํฐ, A
ํ๋ ฌ)
์ ๋ over
๋ฅผ ์ ํธํฉ๋๋ค. ๋๊ดํธ์ ์ ์ ๋ง์ด ์ฌ์ฉํ๋ ๋์ ์ผ๋ฐ ๊ตฌ๋ฌธ์ผ๋ก ํํ์์ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋น์ ์ด ์ด์์ ํ ๊ฒ์ ๋ํด ์ณ์ต๋๋ค. ์ ์๊ฐ์ ์ ์ ์์ ์กฐ์ ํ๊ณ ์ฒด๊ณํํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ๋ชจ๋ ์ฌ๋๋ค์ ์ธ๋ด์ฌ์ ๋ ์ด์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ์ง ์๊ธฐ ์ํด https://gist.github.com/mschauer/b04e000e9d0963e40058 ์์ ์ง๋์ ์ธ๋ฑ์ค ๋ฑ์ ๋ํ ๋ด ์๊ฐ์ ์ผ์ต๋๋ค.
์ด ์ค๋ ๋๋ฅผ ์ฝ์ ํ ์ง๊ธ๊น์ง ๋ด๊ฐ ์ ํธํ๋ ๊ฒ์ ๊ฐ๋จํ ๊ฒ๊ณผ ๋ฒกํฐํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ๋๋ ์ฌ๋๋ค์ ๋ํด _both_ f.(x)
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค(" .
f(x^2)-x over x
vectorized" ๊ด์ฉ๊ตฌ๊ฐ ๊ฝค ์ผ๋ฐ์ ์
๋๋ค). ๋ ๋ณต์กํ ํํ์์ ๊ฒฝ์ฐ
Matlab, Numpy ๋ฑ์์ ์จ ์ฌ๋๋ค์ด ๋๋ฌด ๋ง์ ๋ฒกํฐํ๋ ํจ์ ๊ตฌ๋ฌธ์ ์์ ํ ํฌ๊ธฐํฉ๋๋ค. ์ ์ ์ถ๊ฐํ๋ผ๊ณ ๋งํ๋ ๊ฒ์ ๊ธฐ์ตํ๊ธฐ ์ฝ์ต๋๋ค. ๋ณต์กํ ํํ์์ ๋จ์ผ ๋ฃจํ๋ก ๋ฒกํฐํํ๊ธฐ ์ํ ์ข์ over
๊ตฌ๋ฌธ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
over
๊ตฌ๋ฌธ์ ์ ๋ง ์๋ชป๋ ๋ฐฉ์์ผ๋ก ์ ๋ฅผ ๋ฌธ์ง๋ฆ
๋๋ค. ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ํํ์์์ ๊ฐ ๋ณ์์ ๋ชจ๋ ์ฌ์ฉ์ด ๋ฒกํฐํ๋๊ฑฐ๋ ๋ฒกํฐํ๋์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, log(A) .- sum(A,1)
โ log
์ ๋ฒกํฐํ๋ฅผ ์ ๊ฑฐํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ํ ํํ์์ ํตํด ํจ์๋ฅผ ๋ฒกํฐํํ ์ ์์ต๋๋ค. ์ด๋ exp(log(A) .- sum(A,1))
๋ฅผ ์์ฑํ๊ณ exp
๋ฐ log
๋ฅผ ๋ฒกํฐํํ๊ณ sum
์๋๊ฐ์?
@StefanKarpinski , ๊ทธ๋ฌ๋ฉด exp.(log.(A) .- sum(A,1))
์ ์ํํ๊ณ ์ถ๊ฐ ์์(์: ์ฑ๋ฅ์ด ์ค์ํ์ง ์์ ๋ํ์ ์ฌ์ฉ์์) ๋๋ s = sum(A, 1); exp(log(A) - s) over A
( sum(A,1)
์ธ ๊ฒฝ์ฐ ์ณ์ง ์์ง๋ง sum
๊ฐ ์์ํ๊ณ ๋ฃจํ/๋งต์์ ๋์ด์ฌ๋ฆฝ๋๋ค.
๋์๊ฒ ์ฒซ ๋ฒ์งธ ์ฐ์ ์์๋ broadcast(f, x...)
๋๋ map(f, x...)
์ ๋ํ f.(x...)
๊ตฌ๋ฌธ์ด๋ฏ๋ก @vectorize
๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๊ทธ ํ์ map
๋ฐ ๋ดํฌ์ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ ์ถ์ฝํ๊ธฐ ์ํด over
(๋๋ ๋ฌด์์ด๋ )์ ๊ฐ์ ๊ตฌ๋ฌธ ์์
์ ๊ณ์ํ ์ ์์ต๋๋ค.
@stevengj -
๊ฐ ๋ธ๋ก๋์บ์คํธ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฒ์งธ ์์ ๊ฐ ์๋ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. A
๊ฐ ํ๋ ฌ์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์ถ๋ ฅ์ ๋จ์ผ ํ ํ๋ ฌ์ ํ๋ ฌ์ด ๋ฉ๋๋ค. ๊ฐ ํ๋ ฌ์ A
์์์ ๋ก๊ทธ์์ ์ฒซ ๋ฒ์งธ ์ฐจ์์ ํฉ๊ณ ๋ฒกํฐ๋ฅผ ๋บ ๊ฒ์
๋๋ค. broadcast((x, y)->exp(log(x)-y), A, sum(A, 1))
๊ฐ ํ์ํฉ๋๋ค. ํ์ง๋ง map
์ ๋ํ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ ๊ฐ๋ ๊ฒ์ด ์ ์ฉํ๊ณ broadcast
์ ๋ํด์๋ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ผ ํ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
sin
์ ๊ฐ์ด ์ญ์ฌ์ ์ผ๋ก ์๋ ๋ฒกํฐํ๋ ํจ์๋ ์ ๊ตฌ๋ฌธ์์๋ ๊ณ์ ์ ์ง๋ฉ๋๊น, ์๋๋ฉด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๊น? ๋๋ f.
๊ตฌ๋ฌธ์กฐ์ฐจ๋ ๊ฐ๋
์ ์ฐ์ํจ ๋
ผ์์ ์ํด ๋๊ธฐ๊ฐ ๋ถ์ฌ๋์ง ์์ ๋ง์ ๊ณผํ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ '๊ณค๋'์ฒ๋ผ ๋๊ปด์ง๊น ๊ฑฑ์ ๋ฉ๋๋ค.
๋ด ์๊ฐ์ sin
์ ๊ฐ์ ์ญ์ฌ์ ์ผ๋ก ๋ฒกํฐํ๋ ํจ์๋ sin.
๋ฅผ ์ํด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ง๋ง ๋ค์ ๋ฆด๋ฆฌ์ค์์ ์์ ํ ์ ๊ฑฐ๋๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก ์ค์๊ตฌ์ ์ผ๋ก ์ฌ์ฉ๋์ง ์์์ผ ํฉ๋๋ค. ๋ค๋ฅธ ๊ณผํ ์ธ์ด ์ฌ์ฉ์์ ์ด์ .
f.(args...)
์ ๋ํ ํ ๊ฐ์ง ์ฌ์ํ(?) ๋ฌธ์ : object.(field)
๊ตฌ๋ฌธ์ ๋๋ถ๋ถ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๊ณ ํฐ ๊ณ ํต ์์ด getfield(object, field)
๋ก ๋์ฒด๋ ์ ์์ง๋ง Base.(:+)(....) = ....
ํ์์ ๋ฉ์๋ ์ ์/์ฐธ์กฐ๊ฐ _lot_์ด๊ณ ์ด๋ฅผ getfield
๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ณ ํต์ค๋ฌ์ธ ๊ฒ์
๋๋ค.
ํ ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Base.(:+)
๋ฅผ ๋ค๋ฅธ ๋ชจ๋ f.(args...)
map(Base, :+)
๋ก ๋ฐ๊พธ๋๋ก ํ์ญ์์ค. ๊ทธ๋ฌ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ map(m::Module, s::Symbol) = getfield(m, s)
๋ฉ์๋๋ฅผ ์ ์ํ์ญ์์ค.Base.:+
๊ตฌ๋ฌธ์ ์ง์ํ๊ณ (ํ์ฌ ์คํจ) Base.(:+)
์ ๋ํ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ์์ ์ด๋ฅผ ๊ถ์ฅํฉ๋๋ค.๋ค์ ๋ฌป๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ด 0.5.0์์ ํ ์ ์๋ ์ผ์
๋๊น? ๋ง์ ๋ฒกํฐํ๋ ์์ฑ์๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด๊ฒ์ผ๋ก ๊ด์ฐฎ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง int32(a)
๋์ map(Int32, a)
$ ๊ฐ ์ฝ๊ฐ ์ง๋ฃจํฉ๋๋ค.
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์์ ์์ ๊ตฌ๋ฌธ์ ์ ํํ๋ ๋ฌธ์ ์ ๋๊น?
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์์ ์์ ๊ตฌ๋ฌธ์ ์ ํํ๋ ๋ฌธ์ ์ ๋๊น?
๋๋ @stevengj ๊ฐ ๊ทธ์ PR https://github.com/JuliaLang/julia/pull/15032 ์์ .sin(x)
sin.(x)
๋ฅผ ์ฐ๋ ๊ฒ์ ์ฐฌ์ฑํ์ฌ ์ข์ ์ฃผ์ฅ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ๊ธธ์ ๋ฆ์๋ค๊ณ ํฉ๋๋ค.
์ด ๊ตฌ๋ฌธ์ ๋ณตํฉ ํํ์์ผ๋ก ํจ์จ์ ์ผ๋ก ์ผ๋ฐํํ ์ ์๋ ์๋ฃจ์ ์ด ์์ง ์๋ค๋ ์ฌ์ค์ ๋ํด ํ ๊ฐ์ง ์ ๋ณดํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋จ๊ณ์์ ์ด ๋ ผ์๋ฅผ ๋ฌด๊ธฐํ ๋ฏธํด๊ฒฐ ์ํ๋ก ์ ์งํ๋ ๊ฒ๋ณด๋ค ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ ์ด ๊ธฐ๋ฅ์ ๋ณํฉํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@JeffBezanson ๋ถ๋ฅ ํ ๋ก ์ค์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธํ๊ธฐ ์ํด ์ด ์ด์ ํ๋ฅผ 0.5.0์ผ๋ก ๋๋๋ฆฌ๊ณ ์์ต๋๋ค. ์ฃผ๋ก ์์ง ์๊ธฐ ์ํจ์ ๋๋ค.
#15032๋ call
์์๋ ์๋ํฉ๋๊น - ์: Int32.(x)
?
@ViralBShah ๋ค. ๋ชจ๋ f.(x...)
๋ f
์ ํ์ ๊ด๊ณ์์ด ๊ตฌ๋ฌธ ์์ค์์ map(f, broadcast, x...)
๋ก ๋ณํ๋ฉ๋๋ค.
์ด๊ฒ์ด $# f[x...]
#$ ์ ๋นํด .
์ ์ฃผ์ ์ด์ ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋งค๋ ฅ์ ์ด์ง๋ง(ํ์ ๋ณ๊ฒฝ์ด ํ์ํ์ง ์์) f::Function
์์๋ง ์๋ํฉ๋๋ค. f[x...]
๋ T[...]
๋ฐฐ์ด ์ดํด์ ๊ฐ๋
์ ์ผ๋ก ์ฝ๊ฐ ์ถฉ๋ํฉ๋๋ค. @StefanKarpinski ๊ฐ ๋๊ดํธ ๊ตฌ๋ฌธ์ ์ข์ํ๋ค๊ณ ์๊ฐํ์ง๋ง?
(๋ค๋ฅธ ์๋ฅผ ๋ค์๋ฉด, PyCall์ o::PyObject
๊ฐ์ฒด๋ ํธ์ถ ๊ฐ๋ฅํ๋ฉฐ, Python ๊ฐ์ฒด o
์ __call__
๋ฉ์๋๋ฅผ ํธ์ถํ์ง๋ง ๋์ผํ ๊ฐ์ฒด๋ o[...]
๋ฅผ ์ง์ํ ์ ์์ต๋๋ค. f[x...]
๋ฐฉ์ก๊ณผ ์ฝ๊ฐ ์ถฉ๋ํ์ง๋ง o.(x...)
๋ฐฉ์ก์์๋ ์ ์๋ํฉ๋๋ค.)
call
๋ ๋ ์ด์ ์กด์ฌํ์ง ์์ต๋๋ค.
(๋๋ f.(x...)
๊ฐ .(
๋ฅผ .+
๋ฑ์ ์ ์ฌ์ฒด๋ก ๋ง๋ ๋ค๋ @nalimilan ์ ์ฃผ์ฅ๋ ์ข์ํฉ๋๋ค.)
๋ค, ์์ ํ๋ช ํ ์ ์ถ๋ ์ ๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ ์ถ์ ๋๋ค. ๊ณ์ํด์ ๋ณํฉํ ์ ์์ต๋๊น?
๋ชจ๋์ด ์๋ getfield๊ฐ ์ค์ ์ฌ์ฉ ์ค๋จ๋์ด์ผ ํฉ๋๊น?
@tkelman , ๋ฌด์๊ณผ ๋์กฐ์ ์ผ๋ก? ๊ทธ๋ฌ๋ Base.(:+)
(์ฆ, ๋ฆฌํฐ๋ด ๊ธฐํธ ์ธ์)์ ๋ํ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ๋ $# getfield
Base.:+
๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค. (_Update_: ๋ฉ์๋ ์ ์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ตฌ๋ฌธ ์ฌ์ฉ ์ค๋จ์ด ํ์ํ์ต๋๋ค.)
@ViralBShah , ๋ชฉ์์ผ์ ๋ถ๋ฅ ํ ๋ก ์์ ์ด์ ๋ํ ๊ฒฐ์ ์ด ์์๋์? #15032๋ ๋ณํฉํ๊ธฐ์ ๊ฝค ์ข์ ์ํ์ ๋๋ค.
Viral์ด ํตํ ์ค ๊ทธ ๋ถ๋ถ์ ๋์น ๊ฒ ๊ฐ์ต๋๋ค. ๋ด ์ธ์์ ์ฌ๋ฌ ์ฌ๋๋ค์ด f.(x)
์ ๋ฏธํ์ ๋ํด ์ฌ์ ํ ์ ๋ณด์ ์ด๋ฉฐ ๋ ์ค ํ๋๋ฅผ ์ ํธํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
~
์ ๋งคํฌ๋ก ๊ตฌ๋ฌธ ๋ถ์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ด์ ์์ด๋์ด๋ ํจํค์ง์์ ๊ต์ฒด ์์
์ด ํ์ํ๋ฉฐ ์ด ์ฃผ๊ธฐ์์ ์๋ํ๊ธฐ์๋ ๋๋ฌด ๋ฆ์์ ๊ฒ์
๋๋ค.์, ๋ช ๊ฐ์ง ์์ฝ์ด ์์ง๋ง ์ง๊ธ์ f.(x)
๋ณด๋ค ๋ ๋์ ์ต์
์ ๋ณผ ์ ์์ต๋๋ค. ~
์ ๊ฐ์ ์์์ ๊ธฐํธ๋ฅผ ์ ํํ๋ ๊ฒ๋ณด๋ค ๋ซ๊ณ .*
๋ฑ์ ์ต์ํ ๋ง์ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ๋ฐ๋ก ์ถ์ธกํ ์๋ ์์ ๊ฒ์
๋๋ค.
๋ด๊ฐ ๋ ์ ์ดํดํ๊ณ ์ถ์ ํ ๊ฐ์ง๋ ์ฌ๋๋ค์ด ๊ธฐ์กด์ ๋ฒกํฐํ๋ ์ ์๋ฅผ .(
_๊ต์ฒด_ํด๋ ๊ด์ฐฎ์์ง ์ฌ๋ถ์
๋๋ค. ์ฌ๋๋ค์ด ๊ต์ฒด๋ฅผ ํ ๋งํผ ๋ง์์ ๋ค์ง ์๋๋ค๋ฉด ๋ ์ฃผ์ ํ ๊ฒ์
๋๋ค.
์ด ํ ๋ก ์ ์จ์ด ์๋ ์ฌ์ฉ์๋ก์ ์ ๋ ์ด๊ฒ์ ์ฌ์ฉํ์ฌ ๊ธฐ์กด์ ๋ฒกํฐํ๋ ์ฝ๋๋ฅผ ๋์ฒดํ๊ณ ์ถ์ต๋๋ค.
๋ฃจํ๊ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ฑ์ ์ํด julia์์ ๋ฒกํฐํ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ์ ๋ ์ด์ ์ ์ธ๊ธํ๋ฏ์ด exp, sin ๋ฑ์ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ๋๋ ์ด๋ฏธ .^, .*๋ฅผ ์ฃ์ ์ฌ๋ถ์ ์ ์ ์ถ๊ฐํ๋ ํํ์์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ํน๊ธ ๋ฑ์ ๋์๊ฒ ์ ๋ง ์์ฐ์ค๋ฝ๊ณ ํจ์ฌ ๋ ๋ช ํํ๊ฒ ๋๊ปด์ง๋๋ค. ํนํ sin(x)์ map(f, x)์ ํผํฉํ๋ ๋์ ์ผ๋ฐ ํ๊ธฐ๋ฒ์ผ๋ก ๋ด ์์ ์ ํจ์๋ฅผ ์ฝ๊ฒ ์ ์ ์ ์์ ๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
๋งํ์๋ฉด ์ผ๋ฐ ์ฌ์ฉ์๋ก์ ์ด๊ฒ์ด ๋ณํฉ๋๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค!
๋๋ fun.(vec)
๋ณด๋ค ์ ์๋ fun[vec]
๊ตฌ๋ฌธ์ ๋ ์ข์ํฉ๋๋ค.
[fun vec]
์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ธ์? ๋ชฉ๋ก ์ดํด์ ๋น์ทํ์ง๋ง ์์์ ๋ณ์๊ฐ ์์ต๋๋ค. T[fun vec]
๋ฅผ ํ ์ ์์ต๋๋ค.
์ด ๊ตฌ๋ฌธ์ ๊ธธ์ด๊ฐ > 1์ธ ๋ฒกํฐ์ ๋ํด Julia 0.4์์ ๋ฌด๋ฃ์ ๋๋ค.
julia> [sin rand(1)]
1x2 Array{Any,2}:
sin 0.0976151
julia> [sin rand(10)]
ERROR: DimensionMismatch("mismatch in dimension 1 (expected 1 got 10)")
in cat_t at abstractarray.jl:850
in hcat at abstractarray.jl:875
[fun over vec]
์ ๊ฐ์ ๊ฒ์ ๊ตฌ๋ฌธ ์์ค์์ ๋ณํ๋ ์ ์์ผ๋ฉฐ [fun(x) for x in vec]
๋ฅผ ๋จ์ํํ ๊ฐ์น๊ฐ ์์ง๋ง map(fun,vec)
๋ณด๋ค ๊ฐ๋จํ์ง๋ ์์ต๋๋ค.
[fun vec]
์ ์ ์ฌํ ๊ตฌ๋ฌธ: (fun vec)
๊ตฌ๋ฌธ์ ๋ฌด๋ฃ์ด๋ฉฐ {fun vec}
๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
julia> (fun vec)
ERROR: syntax: missing separator in tuple
julia> {fun vec}
WARNING: deprecated syntax "{a b ...}".
Use "Any[a b ...]" instead.
1x2 Array{Any,2}:
fun [0.3231600663395422,0.10208482721149204,0.7964663210635679,0.5064134055014935,0.7606900072242995,0.29583012284224064,0.5501131920491444,0.35466150455688483,0.6117729165962635,0.7138111929010424]
@diegozea , fun[vec]
๋ T[vec]
์ ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์ ์ ์ธ๋์์ต๋๋ค. (fun vec)
๋ ๊ธฐ๋ณธ์ ์ผ๋ก Scheme ๊ตฌ๋ฌธ์ด๋ฉฐ ๋ค์ค ์ธ์์ ๊ฒฝ์ฐ (fun vec1 vec2 ...)
๊ฒ์
๋๋ค... ์ด๊ฒ์ ๋ค๋ฅธ Julia ๊ตฌ๋ฌธ๊ณผ ์๋นํ ๋ค๋ฆ
๋๋ค. ์๋๋ฉด ํํ ๊ตฌ๋ฌธ๊ณผ ์ถฉ๋ํ๋ (fun vec1, vec2, ...)
๋ฅผ ์๋ํ์
จ์ต๋๊น? fun.(vecs...)
์ ๋นํด ์ด๋ค ์ด์ ์ด ์๋์ง๋ ๋ช
ํํ์ง ์์ต๋๋ค.
๋ํ ์ฃผ์ ๋ชฉํ๋ ๊ฒฐ๊ตญ @vectorized
ํจ์๋ฅผ ๋์ฒดํ๋ ๊ตฌ๋ฌธ์ ๊ฐ๋ ๊ฒ์ด๋ฉฐ(๋ฐ๋ผ์ "๋ฒกํฐ์์ ์๋ํ๋" ํจ์์ "์ถ๋ณต๋ฐ์" ํ์ ์งํฉ์ด ์๋๋ก ํจ) ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค. ๊ตฌ๋ฌธ์ Matlab, Numpy ๋ฑ์ ๋ฒกํฐํ๋ ๊ธฐ๋ฅ์ ์ต์ํ ์ฌ๋๋ค์๊ฒ ๋ง์๊ณ /์ง๊ด์ ์ด๋ฉฐ/ํธ๋ฆฌํด์ผ ํฉ๋๋ค. ๋ํ sin(A .+ cos(B[:,1]))
์ ๊ฐ์ ํํ์์ ๋ํด ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ๋ ๋ง์ "์ฐฝ์์ " ์ ์์ ๋ฐฐ์ ํฉ๋๋ค.
sin.(A .+ cos.(B[:,1]))
๋ ๊ฒฐ๊ตญ ๊ทธ๋ ๊ฒ ๋๋น ๋ณด์ด์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ข์ ๋ฌธ์๊ฐ ํ์ํฉ๋๋ค. f.(x)
๋ .+
#$์ ์ ์ฌํ .(
๋ก ๋ฌธ์ํ๋ฉ๋๊น?
$ +.
๋ฅผ ์ํด .+
๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ์ ์์ต๋๊น?
# Since
sin.(A .+ cos.(B[:,1]))
# could be written as
sin.(.+(A, cos.(B[:,1])))
# +.
sin.(+.(A, cos.(B[:,1]))) # will be more coherent.
@diegozea , #15032์๋ ์ด๋ฏธ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์์ง๋ง ์ถ๊ฐ ์ ์์ ํ์ํฉ๋๋ค.
.+
์ฒ ์๋ ๊ณ์ .+
์
๋๋ค. ์ฒซ์งธ, ์ด ์ ์ ๋ฐฐ์น๊ฐ ๋๋ฌด ํ๊ณ ํ๊ณ ์ฌ๊ธฐ์์ ์ฒ ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ป์ ์ ์๋ ๊ฒ์ด ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๋์งธ, @nalimilan ์ด ์ง์ ํ๋ฏ์ด .(
๋ฅผ "๋ฒกํฐํ๋ ํจ์ ํธ์ถ ์ฐ์ฐ์"๋ก ์๊ฐํ ์ ์์ผ๋ฉฐ ์ด๋ฌํ ๊ด์ ์์ ๊ตฌ๋ฌธ์ ์ด๋ฏธ ์ผ๊ด์ฑ์ด ์์ต๋๋ค.
( broadcast
(#4883)์ ์ ํ ๊ณ์ฐ์ ์ด๋ ค์์ด ํด๊ฒฐ๋๋ฉด โง
์ฐ์ฐ์์ ๋ํ a .โง b
$#$๊ฐ ์คํ์ผ ๋ฟ์ด๋๋ก ๋ ๋ค๋ฅธ PR์ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. broadcast(โง, a, b)
ํธ์ถ์ ๋ํด ์ด๋ ๊ฒ ํ๋ฉด ๋ ์ด์ .+
+
์ ๋ช
์์ ์ผ๋ก ๊ตฌํํ ํ์๊ฐ ์์ต๋๋ค. ํน์ ์ฐ์ฐ์์ ๋ํด broadcast
๋ฅผ ์ค๋ฒ๋ก๋ํ์ฌ BLAS ํธ์ถ๊ณผ ๊ฐ์ ํน์ ๋ฉ์๋๋ฅผ ๊ณ์ ๊ตฌํํ ์ ์์ต๋๋ค.)
๋ํ
sin(A .+ cos(B[:,1]))
์ ๊ฐ์ ํํ์์ ๋ํด ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ด์ผ ํฉ๋๋ค.
f1.(x, f2.(y .+ z))
๋ฅผ broadcast((a, b, c)->(f1(a, f2(b + c))), x, y, z)
๋ก ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ต๋๊น?
ํธ์ง : ๋๋ ๊ทธ๊ฒ์ด ์ด๋ฏธ ์์์ ์ธ๊ธ ๋ ๊ฒ์ ๋ณด์์ต๋๋ค ... @github์ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ์จ๊ฒจ์ง ์ฃผ์์์ ..
@yuyichao , ๋ฃจํ ํจ์ ์ ํจ์๊ฐ @pure
๋ก ํ์๋ ๊ฒฝ์ฐ(์ ์ด๋ eltypes๊ฐ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒฝ์ฐ) ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง #15032์์ ์ธ๊ธํ๋ฏ์ด ์ด๊ฒ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ํ ์์
์ด์ง, ํ์. (๊ทธ๋ฌ๋ ์ด์ ๊ฐ์ ๋ฒกํฐํ๋ ๊ตฌ๋ฌธ์ ์ค์ํ ๋ด๋ถ ๋ฃจํ์์ ๋ง์ง๋ง ์ฃผ๊ธฐ๋ฅผ ์ง๋ด๋ ๊ฒ๋ณด๋ค ๋ ํธ๋ฆฌํฉ๋๋ค.)
์ฌ๊ธฐ์ ํต์ฌ ๋ชฉํ๋ @vectorized
ํจ์์ ํ์์ฑ์ ์ ๊ฑฐํ๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ์ํด์๋ ์ต์ํ ์ผ๋ฐ์ ์ผ๋ก, ๊ฑฐ์ ํธ๋ฆฌํ๊ณ , ์ต์ํ ๋น ๋ฅธ ๊ตฌ๋ฌธ์ด ํ์ํฉ๋๋ค. ์๋ํ๋ ๋ฃจํ ํจ์ ์ด ํ์ํ์ง๋ ์์ง๋ง ์ฌ์ฉ์์ broadcast
์๋๋ฅผ ์ปดํ์ผ๋ฌ์ ๋
ธ์ถ์์ผ ๋ฏธ๋์ ๋ฃจํ ํจ์ ๊ฐ๋ฅ์ฑ์ ์ฌ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฃจํ ํจ์ ๋ ํ๋ฉด ๋จ์ ์ด ์๋์?
@yuyichao , ๋ฃจํ ์ตํฉ์ ํจ์ฌ ๋ ์ด๋ ค์ด ๋ฌธ์ ์ด๋ฉฐ ์์ํ์ง ์์ ํจ์๋ฅผ ์ ์ธํ๋๋ผ๋ ํญ์ ๊ฐ๋ฅํ ๊ฒ์ ์๋๋๋ค(์: ์์ @StefanKarpinski ์ exp(log(A) .- sum(A,1))
์์ ์ฐธ์กฐ). ๊ทธ๊ฒ์ด ๊ตฌํ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉด ์๋ง๋ _์ ๋_ ๊ตฌํ๋์ง ์์ ๊ฒ์
๋๋ค. ์ ์๊ฐ์๋ โ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ ์ง์ ์ผ๋ก ํด์ผ ํฉ๋๋ค. ์ฌ์ฉ์์ ์๋๋ฅผ ๋๋ฌ๋ด๋ ๊ฒ์ผ๋ก ์์ํ์ญ์์ค. ์์ผ๋ก ๋ ์ต์ ํํ ์ ์๋ค๋ฉด ์ข์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์์์ "๋ฒกํฐํ๋" ๊ธฐ๋ฅ์ ๋ํ ์ผ๋ฐํ๋ ๋์ฒดํ์ด ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์ฅ์ ๋ฌผ์ .+
๋ฑ์ด ํ์ฌ broadcast
์์
์ผ๋ก ํ์์ ๋
ธ์ถ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. .+
๋ ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์
๋๋ค. ๋ด ๊ณํ์ ์์์ ์ธ๊ธํ ๋๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์
๋๋ค( broadcast(+, ...)
.+
์คํ ๋ง๋ค๊ธฐ). ๊ทธ๋ฌ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ง์ ์ธ ๊ฒฝ์ฐ ์งํ์ด ํจ์ฌ ์ฝ์ต๋๋ค.
๋ด ๋ง์ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์ ํจํ๋ค๋ ๊ฒ์ ์ฆ๋ช
ํจ์ผ๋ก์จ ๋ฃจํ ์ตํฉ์ ํ๋ ๊ฒ์ด ์ด๋ ต๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํ์๊ฐ ํ๋ก๋์ ์ผ๋ถ๋ก ๋ณํ์ ํ๋๋ก ํ ์ ์์ต๋๋ค. ์์ ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์์ต๋๋ค. exp.(log.(A) .- sum(A,1))
์ด๊ณ broadcast((x, y)->exp(log(x) - y), A, sum(A, 1))
๋ก ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค.
.+
๊ฐ ์์ง ๊ฐ์ ๋ฒ์ฃผ์ ์ํ์ง ์์๋ ๊ด์ฐฎ๊ณ (๋ณด๋์บ์คํธ๋์ง ์์ ํจ์ ํธ์ถ์ด ์ธ์์ ํฌํจ๋๋ ๊ฒ์ฒ๋ผ) ๋์ค ๋ฒ์ . ๋๋ ์ฃผ๋ก ํ์์์ ๊ทธ๋ฌํ ๋์์ ๊ฐ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง(์ฆ, ๋ชจํธํ์ง ์์์ง) ๊ทธ๋ฆฌ๊ณ ์ด๋ฐ ์์ผ๋ก ์์ฑ๋ ๋ฒกํฐํ ๋ฐ ์ตํฉ ๋ฃจํ๋ฅผ ํ์ฉํ์ฌ ๋จ์ ์ด ์๋์ง ๋ฌป๊ณ ์์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์ ํจํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํจ์ผ๋ก์จ ๋ฃจํ ์ตํฉ์ ํ๋ ๊ฒ์ ์ด๋ ต๋ค
์ปดํ์ผ๋ฌ์์ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ์ด๋ ต์ต๋๋ค(๋ถ๊ฐ๋ฅํ์ง ์์ ์๋ ์์). ํนํ ์ปดํ์ผ๋ฌ์์ broadcast
์ ๋ณต์กํ ๊ตฌํ์ ์กฐ์ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ์์ ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด broadcast
์
๋๋ค. ๋์ ์๊ฐ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ๊ฐ๋ฅํ๋ฉด ํผํด์ผ ํฉ๋๋ค...
์๋ง๋? ํฅ๋ฏธ๋ก์ด ์์ด๋์ด์ด๋ฉฐ .(
๊ตฌ๋ฌธ์ ์ด๋ฐ ์์ผ๋ก "์ตํฉ"์ผ๋ก ์ ์ํ๊ณ ๋ถ์ํ ํจ์์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ํธ์ถ์์๊ฒ ๋งก๊ธฐ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํด ๋ณด์ด์ง ์์ต๋๋ค. ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๊ทธ๊ฒ์ ์๋ํ๊ณ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ด์ง๋ง(์ง๊ธ ๋น์ฅ์ ๋ช
๋ฐฑํ ๋ฌธ์ ๊ฐ ๋ณด์ด์ง ์์) "๋น์ตํฉ" PR ํ์ ์ด ์์
์ ์ํํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
๋๋ "๋น์ตํฉ" PR ํ์ ์ด๊ฒ์ ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
ํนํ .+
๊ฐ ์ด์จ๋ ์ฒ๋ฆฌ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ํ์ ์ํค๊ณ ์ถ์ง ์์ง๋ง @yuyichao ์ ์ ์์ ๋์๊ฒ ๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ์ฃผ์๋ค. ์ฌ๊ธฐ์ ๊ฐ์กฐ์ ์ ์ด๋ค ํจ์๊ฐ ๋ฒกํฐํ๋๋์ง์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ํญ์ ์ฝ๊ฐ ์๋ชป๋ ์์น์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ค์ ์ง๋ฌธ์ ์ด๋ค ๋ณ์๋ฅผ ๋ฒกํฐํํ ์ง์ด๋ฉฐ ๊ฒฐ๊ณผ์ ๋ชจ์์ ์์ ํ ๊ฒฐ์ ํฉ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ๋ฒกํฐํ๋ฅผ ์ํ ํจ์๋ฅผ ํ์ํ๋ ๊ฒ๋ณด๋ค ๋ฒกํฐํ์ ๋ํ ์ธ์๋ฅผ ํ์ํ๋ ๊ฒฝํฅ์ด ์๋ ์ด์ ์ ๋๋ค. ์ธ์๋ฅผ ํ์ํ๋ฉด ํ ์ธ์์ ๋ํด์๋ ๋ฒกํฐํํ์ง๋ง ๋ค๋ฅธ ์ธ์์ ๋ํด์๋ ๋ฒกํฐํํ์ง ์๋ ํจ์๋ ํ์ฉ๋ฉ๋๋ค. ์ฆ, ์ฐ๋ฆฌ๋ ๋ ๋ค ๊ฐ์ง ์ ์์ผ๋ฉฐ ์ด PR์ ๋ด์ฅ๋ ๋ฒกํฐํ๋ ๊ธฐ๋ฅ์ ๋์ฒดํ๋ ์ฆ๊ฐ์ ์ธ ๋ชฉ์ ์ ์ ๊ณตํฉ๋๋ค.
@StefanKarpinski , f.(args...)
๋๋ broadcast(f, args...)
๋ฅผ ํธ์ถํ๋ฉด ์ธ์ _๋ชจ๋ _์ ๋ํด ๋ฒกํฐํ๋ฉ๋๋ค. (์ด ๋ชฉ์ ์ ์ํด ์ค์นผ๋ผ๋ 0์ฐจ์ ๋ฐฐ์ด๋ก ์ทจ๊ธ๋๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์.) @yuyichao ์ f.(args...)
= _fused broadcast syntax_ ์ ์์์ (๋ด๊ฐ ์ ์ ๋ ์ข์ํ๋) ์ตํฉ์ " stop"์ func.(args...)
๊ฐ ์๋ ํํ์์์ ์ฌ์ฉํ์ญ์์ค(์์ผ๋ก .+
๋ฑ์ ํฌํจํ๊ธฐ ์ํด).
์๋ฅผ ๋ค์ด sin.(x .+ cos.(x .^ sum(x.^2)))
๋ ( julia-syntax.scm
์์ ) broadcast((x, _s_) -> sin(x + cos(x^_s_)), x, sum(broacast(^, x, 2)))
๋ก ๋ฐ๋๋๋ค. sum
ํจ์๋ "์ตํฉ ๊ฒฝ๊ณ"๊ฐ ๋ฉ๋๋ค. ํธ์ถ์๋ ์ตํฉ์ด ๋ถ์์ฉ์ ๋ง์น ๊ฒฝ์ฐ f.(args...)
๋ฅผ ์ฌ์ฉํ์ง ์์ ์ฑ
์์ด ์์ต๋๋ค.
์ด๊ฒ์ผ๋ก ์ถฉ๋ถํ์ง ์์ ์๊ฐ ์์ต๋๊น?
๋ด๊ฐ ์ ์ ๋ ์ข์ํ๋
๋ง์์ ๋์ ๋ค๋ ๋คํ์ ๋๋ค. =)
๊ฐ์ ๋ผ์ด๋์ ์ํ์ง ์์ ์๋ ์๋ ๋ ๋ค๋ฅธ ํ์ฅ์ .=
, .*=
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํ์ฌ ์ ์๋ฆฌ ํ ๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ผ๋ฐ ํ ๋น)
์, ๋ค๋ฅธ ์์
์ ๋ํ ์ตํฉ ๋ถ์กฑ์ #7052์ .+=
๋ฑ์ ๋ํ ์ ์ ์ฃผ์ ๋ฐ๋์์ต๋๋ค. ํ์ง๋ง .=
๋ฅผ ๋ค๋ฅธ func.(args...)
ํธ์ถ๊ณผ ์ตํฉํ๋ฉด ํด๊ฒฐ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. . ์๋๋ฉด ๊ทธ๋ฅ ์ตํฉ x[:] = ...
.
:thumbsup: ์ด ํ ๋ก ์๋ ์ค์ ๋ก ์ง๊ตํ๋ ๋ ๊ฐ์ง ๊ฐ๋
์ด ํจ๊ป ๋ชจ์ฌ ์์ต๋๋ค.
matlab'y "์ตํฉ ๋ฐฉ์ก ์์
" ๋๋ x .* y .+ z
๋ฐ f[product(I,J)...]
๋ฐ f[zip(I,J)...]
์ ๊ฐ์ "์ ํ ๋ฐ zip์ ๋ํ ๋งคํ". ์๋ก์ ๊ณผ๊ฑฐ ์ด์ผ๊ธฐ๋ ๊ทธ์ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค.
@mschauer , $# I
์ J
๊ฐ ๊ฐ์ ๋ชจ์์ด๋ฉด f.(I, J)
๋ ์ด๋ฏธ (#15032์์) map(x -> f(x...), zip(I, J)
$ ์ ๊ฐ์ต๋๋ค. I
๊ฐ ํ ๋ฒกํฐ์ด๊ณ J
๊ฐ ์ด ๋ฒกํฐ์ด๊ฑฐ๋ ๊ทธ ๋ฐ๋์ธ ๊ฒฝ์ฐ broadcast
๋ ์ค์ ๋ก ์ ํ ์ธํธ์ ๋งคํ๋ฉ๋๋ค(๋๋ f.(I, J')
๋ ๋ค 1d ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ). ๊ทธ๋์ ๋๋ ๋น์ ์ด ๊ฐ๋
์ด "๋งค์ฐ ์ง๊ต์ "์ด๋ผ๊ณ ์๊ฐํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
Orthogonal์ ์ฌ๋ฐ๋ฅธ ๋จ์ด๊ฐ ์๋๋ผ ๊ณต์กดํ ์ ์์ ์ ๋๋ก ๋ค๋ฆ ๋๋ค.
๊ทธ๋ฌ๋ ์์ ์ ๋ ๊ฒฝ์ฐ์ ๋ํด ๋ณ๋์ ๊ตฌ๋ฌธ์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์
๋๋ค. func.(args...)
๋ ๋ ๋ค ์ง์ํ ์ ์์ต๋๋ค.
์ผ๋(Stefan, Jeff, Viral)์ ๊ตฌ์ฑ์์ด #15032(๋ณํฉ ์ค๋น๊ฐ ๋ ๊ฒ์ผ๋ก ์๊ฐ๋จ)๋ฅผ ๋ณํฉํ๋ฉด ์ด๋ฅผ ๋ซ๊ณ ๋ก๋๋งต ๋ฌธ์ ๋ฅผ ์ ์ถํ์ฌ ๋๋จธ์ง ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ๋ตํ๊ฒ ์ค๋ช
ํฉ๋๋ค. ๋ธ๋ก๋์บ์คํธ ์ ํ ๊ณ์ฐ ์์ , ์ฌ์ฉ ์ค๋จ @vectorize
, .op
๋ฅผ ๋ธ๋ก๋์บ์คํธ ์คํ์ผ๋ก ๋ฐ๊พธ๊ณ ๊ตฌ๋ฌธ ์์ค "broadcast-fusion"์ ์ถ๊ฐํ๊ณ ๋ง์ง๋ง์ผ๋ก ์ ์๋ฆฌ ํ ๋น๊ณผ ์ตํฉํฉ๋๋ค. ๋ง์ง๋ง ๋ ๊ฐ๋ ์๋ง๋ 0.5๊ฐ ๋์ง ์์ ๊ฒ์
๋๋ค.
์๋ ํ์ธ์, ์ ๋ 15032์ ๋ํด ๋งค์ฐ ํ๋ณตํ๊ณ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋๋ ํ ๋ก ์ ๋ฌด์ํ์ง๋ ์๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฒกํฐ ๋ฐ ์ ์ฌํ ๊ฐ์ฒด์ ๋ฒกํฐ๋ ์ค๋ฆฌ์์์ ์ฌ์ฉํ๊ธฐ์๋ ์ฌ์ ํ ๋งค์ฐ ์ด์ํ์ง๋ง ์ดํด์ ๊ฒฐ๊ณผ๋ก ์ก์ด์ฒ๋ผ ์น์ด ํ์ธ ์ ์์ต๋๋ค. ์ฑ๊ธํค ์ฐจ์์ผ๋ก์ ๋ฐ๋ณต ์ธ์ฝ๋ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ง ์๋ ์ข์ ์์์ ํ๊ธฐ๋ฒ์ ์๋ฅผ ๋ค์ด flexed out iterator ๋ฐ ์๋ก์ด ์์ฑ๊ธฐ ํํ์๊ณผ ๊ฐ์ด ์ด๊ฒ์ ๋ง์ด ์ํํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด #16285์ ์ฐฌ์ฑํ์ฌ ์ง๊ธ ๋ซ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ผ๋(Stefan, Jeff, Viral)์ ๊ตฌ์ฑ์์ด #15032(๋ณํฉ ์ค๋น๊ฐ ๋ ๊ฒ์ผ๋ก ์๊ฐ๋จ)๋ฅผ ๋ณํฉํ๋ฉด ์ด๋ฅผ ๋ซ๊ณ ๋ก๋๋งต ๋ฌธ์ ๋ฅผ ์ ์ถํ์ฌ ๋๋จธ์ง ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํฉ๋๋ค. ๋ธ๋ก๋์บ์คํธ ์ ํ ๊ณ์ฐ ์์ , ์ฌ์ฉ ์ค๋จ
@vectorize
,.op
๋ฅผ ๋ธ๋ก๋์บ์คํธ ์คํ์ผ๋ก ๋ฐ๊พธ๊ณ ๊ตฌ๋ฌธ ์์ค "broadcast-fusion"์ ์ถ๊ฐํ๊ณ ๋ง์ง๋ง์ผ๋ก ์ ์๋ฆฌ ํ ๋น๊ณผ ์ตํฉํฉ๋๋ค. ๋ง์ง๋ง ๋ ๊ฐ๋ ์๋ง๋ 0.5๊ฐ ๋์ง ์์ ๊ฒ์ ๋๋ค.