Julia: `map(func, x)`์˜ ๋Œ€์ฒด ๊ตฌ๋ฌธ

์— ๋งŒ๋“  2014๋…„ 09์›” 23์ผ  ยท  283์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JuliaLang/julia

์ด๊ฒƒ ์€ ์—ฌ๊ธฐ ์—์„œ ์ข€ ๋” ์ž์„ธํžˆ ๋…ผ์˜ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค . ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ฐพ๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๊ณ  ๊ทธ๊ฒƒ์ด ์ž์ฒด ๋ฌธ์ œ๋ฅผ ๊ฐ€์งˆ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

breaking speculative

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์‚ผ๋‘(Stefan, Jeff, Viral)์˜ ๊ตฌ์„ฑ์›์ด #15032(๋ณ‘ํ•ฉ ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋จ)๋ฅผ ๋ณ‘ํ•ฉํ•˜๋ฉด ์ด๋ฅผ ๋‹ซ๊ณ  ๋กœ๋“œ๋งต ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์—ฌ ๋‚˜๋จธ์ง€ ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์œ ํ˜• ๊ณ„์‚ฐ ์ˆ˜์ •, ์‚ฌ์šฉ ์ค‘๋‹จ @vectorize , .op ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์„คํƒ•์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๊ตฌ๋ฌธ ์ˆ˜์ค€ "broadcast-fusion"์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ œ์ž๋ฆฌ ํ• ๋‹น๊ณผ ์œตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‘ ๊ฐœ๋Š” ์•„๋งˆ๋„ 0.5๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  283 ๋Œ“๊ธ€

+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 ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์ˆ˜ํ•œ ์ ˆ๋ง์—์„œ ๋‚˜์˜จ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์•„์ด๋””์–ด:

  1. ์ฝœ๋ก  ์˜ค๋ฒ„๋กœ๋“œ, sin:x . ์—ฌ๋Ÿฌ ์ฃผ์žฅ์œผ๋กœ ์ž˜ ์ผ๋ฐ˜ํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. sin.[x] --- ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  3. 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 ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฒกํ„ฐํ™”๋œ ์ˆ˜ํ•™ ํ•จ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค.

  1. ๊ฐœ์ธ์ ์œผ๋กœ exp(x) map(exp, x) ์„ ์“ฐ๋Š” ๊ฒƒ์€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„๋ก ํ›„์ž๊ฐ€ ์•ฝ๊ฐ„ ๋” ์งง๊ณ  ๊น”๋”ํ•˜๊ธด ํ•˜์ง€๋งŒ์š”. ๊ทธ๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ์—๋Š” _ํฐ_ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒกํ„ฐํ™”๋œ ๊ธฐ๋Šฅ์€ ๋‚ด ์ปดํ“จํ„ฐ์˜ ์ง€๋„๋ณด๋‹ค ์•ฝ 5๋ฐฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.
  2. ๋ณตํ•ฉ ํ‘œํ˜„์‹์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋” ํฅ๋ฏธ๋กœ์›Œ์ง‘๋‹ˆ๋‹ค. 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, ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ์ œ์•ˆ์€ ์‹œ๊ฐ์ ์œผ๋กœ ๊ธฐ์กด ๊ตฌ๋ฌธ์— ๋„ˆ๋ฌด ๊ฐ€๊น๊ณ  ์ฝ”๋“œ๋ฅผ ๋ณผ ๋•Œ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์ •์‹ ์  ๋…ธ๋ ฅ์ด ๋” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • foo.(x) -- ํ‘œ์ค€ ์œ ํ˜• ๋ฉค๋ฒ„ ์•ก์„ธ์Šค์™€ ์‹œ๊ฐ์ ์œผ๋กœ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • foo[x] -- foo ๋ฐฐ์—ด์˜ x๋ฒˆ์งธ ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์—ฌ๊ธฐ์—์„œ ๋งต์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๊นŒ?
  • .foo(x) -- @kmsquire ๊ฐ€ ์ง€์ ํ•œ ๋Œ€๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  @vec ์†”๋ฃจ์…˜์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ํ”ผํ•˜๋ ค๋Š” @vectorize ์— ๋„ˆ๋ฌด ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ, ์ผ๋ถ€ ์ฃผ์„ ala #8297์€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ด๋ฉฐ ๋ฏธ๋ž˜์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋” ๋˜‘๋˜‘ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋Ÿฌํ•œ ์ŠคํŠธ๋ฆผ ์œตํ•ฉ ๊ธฐํšŒ๋ฅผ ์ธ์‹ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ•์š”ํ•˜๋Š” ์ƒ๊ฐ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Infix ๋งต๊ณผ ๋น ๋ฅธ ์ต๋ช… ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ž„์‹œ ์ƒ์„ฑ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(x, y) -> exp(0.5 * abs2(x - y)) $ x, y

๋ฒกํ„ฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ง€์ •ํ•˜๋Š” ๋งฅ๋ฝ์—์„œ ๋ฉ‹์ง„ ์ƒˆ๋กœ์šด Trait.jl ์˜ ์•„์ด๋””์–ด๋ฅผ ๋นŒ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ ์šฐ๋ฆฌ๋Š” ํŠน์ • ํŠน์„ฑ์„ ๊ฐ€์ง„ julia Type ๋Œ€์‹  Function ์œ ํ˜•์˜ ๊ฐœ๋ณ„ _instances_๊ฐ€ ๋ฒกํ„ฐํ™” ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์‚ฌ์šฉ์ž ์ •์˜ ์ค‘์œ„ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ Haskell๊ณผ ๊ฐ™์€ ์ง€์›๋งŒ ์žˆ๋‹ค๋ฉด

6582 #6929 ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ์ˆ˜์˜ ์ž„์‹œ ๋ฐฐ์—ด๋กœ ์ „์ฒด ํ‘œํ˜„์‹์„ ๋ฒกํ„ฐํ™”ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ด ๋…ผ์˜์˜ ์š”์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒกํ„ฐํ™”๋œ ๊ตฌ๋ฌธ์„ ์›ํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ๋ฒกํ„ฐํ™”๋œ 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)

๊ทธ๋Ÿฌ๋ฉด

  1. X ์œ ํ˜•์ด Matrix{Float64} ์ด๊ณ  ์š”์†Œ(์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜) Float64 ๊ฐ€ ์žˆ๋Š” X ์—์„œ ์ƒ์Šน๋„์˜ ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ๋„๋ฉ”์ธ ์‹๋ณ„(๋”ฐ๋ผ์„œ Float64 => Matrix{Float64} ์ƒ์Šน๋„๋ฅผ ์•”์‹œ์ ์œผ๋กœ ์ •์˜) , ๊ทธ ๋‹ค์Œ์—
  2. 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์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฃจํ”„๋งŒํผ ๋น ๋ฆ…๋‹ˆ๋‹ค.

์ธ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ธ๋ผ์ธ์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์ •๋ง ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ถ”๋ก ๋œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ 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

๋‹ค์Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ์ด๋ฏธ ์„ค๋ฌธ์กฐ์‚ฌ๋ฅผ ํ•˜์…จ๋‹ค๋‹ˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ณ„์† ์ง„ํ–‰ํ•˜์„ธ์š”!

  • ๊ท€ํ•˜์˜ ํˆฌํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™๋ณดํ•ด ์˜ค์…จ์Šต๋‹ˆ๊นŒ?
  • ๋‚ด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ํ‰๊ฐ€ํ•œ ์„ค๋ฌธ์กฐ์‚ฌ/์„ค๋ฌธ์กฐ์‚ฌ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ kwiksurveys.com์€ ์‚ฌ์šฉ์ž๊ฐ€ _์ด ์˜ต์…˜ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋‚˜๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค_ ์˜ต์…˜ ๋Œ€์‹  ์ž์‹ ์˜ ์˜๊ฒฌ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

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์ž…๋‹ˆ๋‹ค.

  1. ์‹ค์ œ๋กœ @Jutho ๊ฐ€ ์ œ์•ˆํ•œ f[a...] ๋ถ€ํ„ฐ ์ปจ๋ฒค์…˜
    ๋ฒกํ„ฐ a, b์— ๋Œ€ํ•ด
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) ์˜ ๋ฏธํ•™์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ์œ ๋ณด์ ์ด๋ฉฐ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ์ค‘์œ„ ์—ฐ์‚ฐ์ž๋Š” ๊ฐœ๋…์ ์œผ๋กœ๋‚˜ ๊ตฌํ˜„์—์„œ ๋” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ASCII ์—ฐ์‚ฐ์ž๋Š” ์—†์Šต๋‹ˆ๋‹ค. ~ ์˜ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ด์ „ ์•„์ด๋””์–ด๋Š” ํŒจํ‚ค์ง€์—์„œ ๊ต์ฒด ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฉฐ ์ด ์ฃผ๊ธฐ์—์„œ ์‹œ๋„ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ๋˜๋Š” ๋ฃจํ”„๋ฅผ ๋” ์‰ฝ๊ฒŒ ์œตํ•ฉํ•˜๊ณ  ์ž„์‹œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋Œ€์ฒด ๊ตฌ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. #15032 ์ˆ˜์ค€ ๊ทผ์ฒ˜์— ๋‹ค๋ฅธ ๋Œ€์•ˆ์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์˜ˆ์•ฝ์ด ๋‚จ์•„ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณ‘ํ•ฉํ•˜์—ฌ ์‹œ๋„ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์•ฝ์ด ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ 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์— ์ฐฌ์„ฑํ•˜์—ฌ ์ง€๊ธˆ ๋‹ซ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰