+1
ãŸãã¯ãç³è¡£æ§æãšããŠfunc.(args...)
broadcast(func, args...)
ããããå€åç§ã¯ããã奜ãå¯äžã®äººã§ããïŒ
ãããã«ããã+ 1ã
ïŒ-1ïŒã©ã¡ãããšããã°ãã¹ããã¡ã³ã®ä»ã®f[...]
ã®ææ¡ã¯ãç解ãšéåžžã«ãã䌌ãŠãããšæããŸãã
@ihnortonã®ããã«ãç§ããã®ã¢ã€ãã¢ãããŸã奜ãã§ã¯ãããŸããã ç¹ã«ã a .+ b
ãšsin.(a)
ã®äž¡æ¹ãæã€ãšããé察称æ§ã¯å«ãã§ãã
ãã¶ããç¹å¥ãªæ§æã¯å¿ èŠãããŸããã ïŒ1470ã§ãç§ãã¡ã¯æ¬¡ã®ãããªããšãããããšãã§ããŸã
call(f::Callable,x::AbstractArray) = applicable(f,x) ? apply(f,x) : map(f,x)
æ£ããïŒ ãããããããã¯éæ³ã®ããã«æããŸãããã©ã®é¢æ°ã§ãèªåããããååŸããããšã¯ã§ããŸããã
@quinnjãã®1è¡ã¯ãåŒã³åºãã®ãªãŒããŒããŒããèš±å¯ããããšã«ã€ããŠã®ç§ã®æ倧ã®æããèŠçŽããŠããŸãã ç§ã¯äœæ¥ãç ãããšãã§ããªããªããŸãã
æ§æçã«å¯èœãã©ããã¯ãŸã ããããŸãããã .sin(x)
ã©ãã§ããããã ããã¯a .+ b
ã«ãã£ãšäŒŒãŠããŸããïŒ
[]
ã¯éè² è·ã«ãªããããŠããããã®ç®çã«ã¯æ©èœããªããšæããŸãã ããšãã°ãããããInt(x)
ãèšè¿°ã§ããŸããã Int[x]
ã¯é
åãäœæããããã map
ãæå³ããããšã¯ã§ããŸããã
ç§ã¯.sin(x)
ã§æä¹ããŸãã
ãã®ããã«ããã€ãã®æ§æãã¯ããŒããã¯ããå¿
èŠããããŸããã Int(x)
ãã¹ã«ã©ãŒããŒãžã§ã³ã§ããå Žåã Int[x]
ã¯ãèŠçŽ ã¿ã€ãInt
ã®ãã¯ãã«ãæ§ç¯ããããã®é¡æšã«ãã£ãŠåççã§ãã ç§ã®èãã§ã¯ããã®æ§æãããäžè²«æ§ã®ãããã®ã«ããæ©äŒã¯ãå®éã«ã¯f[v]
ææ¡ã®æãé
åçãªåŽé¢ã®1ã€ã§ãã
map
ã®f[v]
æ§æãäœæãããšãæ§æã®äžè²«æ§ãã©ã®ããã«åäžããŸããïŒ ããããŸããã map
ã¯ãçŸåšã®T[...]
é
åã³ã³ã¹ãã©ã¯ã¿ãŒæ§æãšã¯ç°ãªãã圢ç¶ããæã£ãŠããŸãã Vector{Int}[...]
ã©ãã§ããïŒ ããã¯ããŸããããŸãããïŒ
ç¬ãæã@JeffBezansonããããªããïŒ ã¯ã¯ã¯ãåŒã³åºãã®ãªãŒããŒããŒãã¯ç¢ºãã«å°ãæãã§ããããŸã«ããžã¥ãªã¢ã§å®è¡ã§ããã³ãŒãã®é£èªåã®çš®é¡ã«ã€ããŠèããŸãcall
ã䜿çšãããšãåä»ãªããšãå®è¡ã§ããŸãã
.sin(x)
ãããèãã ãšæããŸãã ãã«ãåŒæ°ãã©ããããã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ã¯ãããŸãããïŒ
ïŒ-1:ã é«éé¢æ°ã䜿çšããå Žåãšæ¯èŒããŠã2æåãç¯çŽããããšã¯ãèªã¿ãããã®ã³ã¹ãã«èŠåã䟡å€ã¯ãªããšæããŸãã .func()
/ func.()
ãšfunc()
ãããããšããã«æ£åšããŠãããã¡ã€ã«ãæ³åã§ããŸããïŒ
å°ãªããšãããšã«ããa.(b)
æ§æãåé€ããå¯èœæ§ããããŸãã
ãããŒãããããã®å·£ãããæ··ããããšã«ã€ããŠè©±ããŠãã ããïŒ è°è«ãããããåæ ããããã«ååãå€æŽããŸããã
2åŒæ°ã®ååãmap
ããzipWith
ã«å€æŽããããšãã§ããŸã:)
ããã€ãã®æ§æãæ¬åœã«å¿
èŠãªå Žåã¯ã [f <- b]
ãŸãã¯æ¬åŒ§ã®_å
åŽ_ã®å
å
è¡šèšã«é¢ããå¥ã®ãããã¯ã©ãã§ããïŒ
ïŒ @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/jakebolewski/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
ã奜ããã1ã€ã®çç±ã¯ãæçµçã«Base.(+)
ã䜿çšããŠ$ïŒ Base
ã®+
é¢æ°ã«ã¢ã¯ã»ã¹ã§ããããã«ããããšã§ãïŒ1åã¯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
ã¯ããŸã圹ã«ç«ããªããšæããŸãããŸããbïŒHaskellã®æ§æã®åŸã«ãã³çãããã®ã倧奜ãã§ãã ;ïŒ
IIRCãHaskellã§ã¯ãäžèšã¯filter ((==val) . func2 . fst) $ map (func1 other args) container
ãšæžãããšãã§ããŸãããåŒæ°ã®é åºãfunc1
ã«å°ãå€æŽããŸãã
elmã§ã¯.func
ã¯x->x.func
ã§å®çŸ©ãããããã¯éåžžã«äŸ¿å©ã§ããelmã¬ã³ãŒããåç
§ããŠãã ããã map
ã§ãã®æ§æã䜿çšããåã«ããããèæ
®ããå¿
èŠããããŸãã
ç§ã¯ããã§ãã
ãžã¥ãªã¢ã§ã¯ãå€ãã®èšèªã»ã©ãã£ãŒã«ãã¢ã¯ã»ã¹ã¯ããã»ã©éèŠã§ã¯ãããŸãããã
ã¯ãããžã¥ãªã¢ã®ãã£ãŒã«ãã¯ããã©ã€ããŒãããªçšéã«åããŠãããããããã§ã¯ããŸãé¢é£æ§ããªããšæããŠããŸãã ãããããã£ãŒã«ãã¢ã¯ã»ã¹ã®ãªãŒããŒããŒãã«ã€ããŠã®é²è¡äžã®è°è«ã«ãããããã¯ããè³¢æã«ãªããããããŸããã
$ïŒ$ .+
ã®é察称æ§ããªããã°ã f.(x)
ã¯åé¡ã®å°ãªã解決çã®ããã«èŠããŸãã ãããã .
ãšãèŠçŽ ããšã®æäœãã®ã·ã³ããªãã¯ãªé¢é£ä»ããç¶æããããšã¯ãç§èŠãšããŠã¯è¯ãèãã§ãã
çŸåšã®åä»ãé
åæ§é ãéæšå¥šã«ãªãå¯èœæ§ãããå Žåã¯ã func[v...]
ãmap(func, v...)
ã«å€æãããªãã©ã«é
åãïŒçŸåšã®T[a1, ..., an]
ã®ä»£ããã«ïŒ 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
ãçæããŸããïŒ
ããããç§ãèšã£ãããã«ãç§ã¯ãŸã£ããæ瀺ããŠããŸããã§ãããã2ã€ã®ç°ãªãåŒã³åºãæŒç®åãå¿ èŠã§ãã èŠçŽ ããšã®æäœã®ããã®_èŠèŠçã«_äžè²«ããæ§æãèŠã€ããããšããŠããã ãã§ãã
ç§ã«ãšã£ãŠããããã®ãªãã·ã§ã³ã殺ãã®ã¯ããã«ãåŒæ°é¢æ°ãã©ã®ããã«ãã¯ãã«åããããšããåé¡ã§ãã ãããè¡ãåäžã®æ¹æ³ã¯ãããŸããããã¹ãŠã®å¯èœãªæ¹æ³ããµããŒãããã®ã«ååäžè¬çãªãã®ã¯ãç§ãã¡ããã§ã«æã£ãŠããå€æ¬¡å é åå å ã«éåžžã«ãã䌌ãŠããŸãã
è€æ°ã®åŒæ°map
ããã¹ãŠã®åŒæ°ãå埩åŠçããããšã¯ãéåžžã«æšæºçã§ãã
ãããè¡ããšãããããåŒã³åºãããã®ãïŒæ§æãäœæãããŸãããã®æ§æã¯æ¬¡ã®ããã«ãªããŸãã
ãããããªçç±ã§ããã»ã©çŽ æŽããããšã¯èšããŸããããç§ã¯ãããã®é¢ã§å€§äžå€«ã§ãããã
è€æ°åŒæ°é¢æ°ã«å¯ŸããŠããã€ãã®äžè¬åãå¯èœã§ãããšããäºå®ã¯ãå°ãªããšãããã€ãã®ç¹æ®ãªã±ãŒã¹ããµããŒãããããšã«å察ããè°è«ã«ã¯ãªãåŸãŸããããã³ãœã«ã«å¯ŸããŠããã€ãã®æ¹æ³ã§äžè¬åã§ããå Žåã§ããè¡å転眮ã圹ç«ã€ã®ãšåãã§ãã
æãæçšãªãœãªã¥ãŒã·ã§ã³ãéžæããå¿
èŠããããŸãã å¯èœãªéžæè¢ã«ã€ããŠã¯ã https ïŒ//github.com/JuliaLang/julia/issues/8389#issuecomment -55953120ïŒããã³ä»¥äžã®ã³ã¡ã³ãïŒã§ãã§ã«èª¬æãããŠããŸãã @JeffBezansonãèšã£ãããã«ã map
ã®çŸåšã®æ¯ãèãã¯åççã§ãã èå³æ·±ãåºæºã¯ã @vectorize_2arg
ã眮ãæããããšãã§ããããšã§ãã
ç§ã®ãã€ã³ãã¯ã sin.(x)
ãšx .+ y
ãå
±åããã®ã¯åä»ã ãšããããšã§ãã .sin(x) -> map(sin, x)
ãšx .+ y -> map(+, x, y)
ã欲ããã§ãã
.+
ã¯å®éã«ã¯broadcast
ã䜿çšããŸãã
çŽç²ãªçµ¶æããã®ããã€ãã®ä»ã®ã¢ã€ãã¢ïŒ
sin:x
ã è€æ°ã®åŒæ°ã«ããŸãäžè¬åãããŠããŸãããsin.[x]
---ãã®æ§æã¯äœ¿çšå¯èœã§ãããçŸåšã¯æå³ããããŸãããsin@x
---å©çšå¯èœã§ã¯ãããŸããããããããå¯èœã§ãç§ã¯ãããå¿ èŠã ãšã¯æ¬åœã«ç¢ºä¿¡ããŠããŸããã
ç§ããã¡ã ããã§ã¯f.(x)
ãæé©ãªãªãã·ã§ã³ã ãšæããŸãããç§ã¯ããã奜ãã§ã¯ãããŸããã
ããããããããªããã°ãããããçš®é¡ã®ãã¯ãã«åãããé¢æ°ãç¹ã«int()
ã®ãããªãã®ã®äœæãåé¿ããã«ã¯ã©ãããã°ããã§ããããã ãããã httpsïŒ//github.com/JuliaLang/julia/issues/8389ã§ãã®ãã£ã¹ã«ãã·ã§ã³ãéå§ãããã£ããã«ãªããŸããã
map(func, x)
ã®äœ¿çšãæšå¥šããå¿
èŠããããŸãã ã¿ã€ãã³ã°ã¯ããã»ã©å€ããªããä»ã®èšèªããæ¥ã人ãªã誰ã§ãããã«ããããŸãã
ãããŠãã¡ããããããéãããšã確èªããŠãã ããã
ãããã§ãã€ã³ã¿ã©ã¯ãã£ãã«äœ¿ããšãšãŠãèŸãã§ãã ããã¯Rããæ¥ã人ã ã«ãšã£ãŠå€§ããªè¿·æã«ãªãã§ãããïŒå°ãªããšããç§ã¯ä»ã®èšèªã«ã€ããŠã¯ç¥ããŸããïŒããããŠç§ã¯ããããžã¥ãªã¢ãããŒã¿åæã«é©ããŠããªããšããæããäžããããããŸããã
ãã1ã€ã®åé¡ã¯äžè²«æ§ã§ãã log
ã exp
ãªã©ãçŸåšãã¯ãã«åãããŠãããã¹ãŠã®é¢æ°ãåé€ãã代ããã«map
ã䜿çšããããã«äŸé Œããå Žåãé€ããŸãïŒãã®æ±ºå®ã®å®çšæ§ã®èå³æ·±ããã¹ãïŒãèšèªã¯äžè²«æ§ããªããªããé¢æ°ããã¯ãã«åãããŠãããã©ããïŒããã³ã©ã®åŒæ°ã§ïŒãäºåã«ç¥ãããšãå°é£ã«ãªããŸãã
ä»ã®å€ãã®èšèªã¯äœå¹Žãã®émap
ã䜿çšããŠããŸãã
ãã¹ãŠã®ãã¯ãã«åãåæ¢ããèšç»ãç解ããã®ã§ãã»ãšãã©/ãã¹ãŠã®ãã¯ãã«åãããé¢æ°ãåé€ããããšã¯åžžã«æŠç¥ã®äžéšã§ããã
ã¯ãã_course_ã®ãã¹ãŠããã¯ãã«åããã®ããããŸãã ççŸã¯ãã§ã«ååšããŸãsin
ã exp
ãªã©ãé
åã«æé»çã«ãããã³ã°ããå¿
èŠããããšãã説åŸåã®ããçç±ããªããããã©ã®é¢æ°ããã¯ãã«åãããããŸãã¯ãã¯ãã«åããå¿
èŠãããããç¥ãããšã¯ãã§ã«å°é£ã§ãã
ãããŠãã©ã€ãã©ãªã®äœæè
ã«ãã¹ãŠã®é©åãªé¢æ°ã«@vectorize
ã眮ãããã«æ瀺ããã®ã¯ã°ãããŠããŸãã é¢æ°ãæžãããšãã§ããã¯ãã§ãã誰ãããã¹ãŠã®èŠçŽ ã«ã€ããŠãããèšç®ãããå Žåã¯ã map
ã䜿çšããŸãã
äžè¬çã«äœ¿çšããããã¯ãã«åãããæ°åŠé¢æ°ãåé€ãããšã©ããªããæ³åããŠã¿ãŸãããã
exp(x)
map(exp, x)
ãæžããŠãããŸããŸããããåŸè
ã¯å°ãçããŠãããã§ãã ãã ããããã©ãŒãã³ã¹ã«ã¯_倧ããª_éãããããŸãã ãã¯ãã«åãããé¢æ°ã¯ãç§ã®ãã·ã³ã®ããããããçŽ5åé«éã§ããexp(0.5 * abs2(x - y))
ããããŠæ¬¡ã®ããã«ãªããŸã# baseline: the shortest way
exp(0.5 * abs2(x - y)) # ... takes 0.03762 sec (for 10^6 elements)
# using map (very cumbersome for compound expressions)
map(exp, 0.5 * map(abs2, x - y)) # ... takes 0.1304 sec (about 3.5x slower)
# using anonymous function (shorter for compound expressions)
map((u, v) -> 0.5 * exp(abs2(u - v)), x, y) # ... takes 0.2228 sec (even slower, about 6x baseline)
# using array comprehension (we have to deal with two array arguments)
# method 1: using zip to combine the arguments (readability not bad)
[0.5 * exp(abs2(u - v)) for (u, v) in zip(x, y)] # ... takes 0.140 sec, comparable to using map
# method 2: using index, resulting in a slightly longer statement
[0.5 * exp(abs2(x[i] - y[i])) for i = 1:length(x)] # ... takes 0.016 sec, 2x faster than baseline
ãã¯ãã«åãããæ°åŠé¢æ°ãåé€ããå Žåãèªã¿ããããšããã©ãŒãã³ã¹ã®äž¡æ¹ã§åãå ¥ããããå¯äžã®æ¹æ³ã¯ãé åã®ç解ã§ããããã«æãããŸãã ããã§ãããããã¯ãã¯ãã«åãããæ°åŠã»ã©äŸ¿å©ã§ã¯ãããŸããã
-ãã¯ãã«åãããããŒãžã§ã³ãåé€ããå Žåã¯-1ã å®éãVMLãYepppãªã©ã®ã©ã€ãã©ãªã¯ããã¯ãã«åãããããŒãžã§ã³ã«å¯ŸããŠã¯ããã«é«ãããã©ãŒãã³ã¹ãæäŸããããããããã掻çšããæ¹æ³ãç解ããå¿ èŠããããŸãã
ããããããŒã¹ã«ãããã©ããã¯å¥ã®è°è«ã§ããããã倧ããªè°è«ã§ãããããŒãºã¯çŸå®çã§ãããããã©ãŒãã³ã¹ã¯ç§ãã¡ãæã£ãŠãããã®ãããé«ããªãå¯èœæ§ããããŸãã
@lindahuaãš@ViralBShah ïŒ map
ãæ¹åããåã«ããã¯ãã«åãããé¢æ°ãåé€ããããšãåæãšããŠããããã§ããã誰ããããããããšãææ¡ããŠãããšã¯æããŸããã
@lindahuaã®äŸã¯éåžžã«ãããããããšæããŸãããã¯ãã«åãããæ§æã¯ãä»ã®ãœãªã¥ãŒã·ã§ã³ãããã¯ããã«åªããŠãããæ°åŒã«éåžžã«è¿ããã®ã§ãã ç§ã¯ããã倱ãã®ã¯ããªãæªãããšã§ãããä»ã®ç§åŠèšèªããæ¥ã人ã ã¯ããããããããžã¥ãªã¢ã®åŠå®çãªç¹ãšèŠãªãã§ãããã
ãã¹ãŠã®ãã¯ãã«åãããé¢æ°ãåé€ããŠãåé¡ãããŸããïŒ map
ãååã«é«éãªå ŽåïŒããããã©ã®ããã«è¡ããããã確èªããŸãã ãã®æç¹ã§ã䟿å©ãªæ§æãæäŸããããšã®é¢å¿ãããã«æããã«ãªããšæããŸãããããäºå®ã§ããããšãå€æããå Žåã¯ããããè¿œå ããææããŸã ãããŸãã
Juliaã¯ãã€ã³ã¿ã©ã¯ãã£ããªäœ¿çšïŒãã®å ŽåãåŒãé·ããªããšå ¥åãç ©ãããïŒãšæ°åŠçãªèšç®ïŒã³ãŒããèªã¿ãããããããã«ãæ°åŒãæ°åŒã«ã§ããã ãè¿ã¥ããå¿ èŠãããïŒãéèŠããŠãããããä»ã®å€ãã®èšèªãšã¯ç°ãªããšæããŸãã ããããMatlabãRãããã³Numpyããã¯ãã«åãããé¢æ°ãæäŸããçç±ã®äžéšã§ãïŒä»ã®çç±ã¯ãã¡ããããã©ãŒãã³ã¹ã§ãããJuliaã§è§£æ¶ãããå¯èœæ§ã®ããåé¡ã§ãïŒã
è°è«ããã®ç§ã®æãã¯ããã¯ãã«åãããæ°åŠã®éèŠæ§ã¯æ§ããã«è¿°ã¹ãããŠãããšããããšã§ãã å®éããã¯ãã«åãããæ°åŠã®äž»ãªå©ç¹ã®1ã€ã¯ãåŒã®ç°¡æœãã«ãããŸããããã¯ããforã«ãŒããé ãèšèªãã®åãªãäžæçãªãã®ã§ã¯ãããŸããã
y = exp(x)
ãšã®æ¯èŒ
for i = 1:length(x)
y[i] = exp(x[i])
end
åè ã¯æããã«åŸè ãããã¯ããã«ç°¡æœã§èªã¿ãããã§ãã Juliaãã«ãŒããå¹ççã«ãããšããäºå®ã¯ãã³ãŒããåžžã«ãã¯ãã«å解é€ããå¿ èŠããããšããæå³ã§ã¯ãããŸãããããã¯ãç§ã«ãšã£ãŠã¯éåžžã«éå¹æã§ãã
ç§ãã¡ã¯äººã ãèªç¶ãªæ¹æ³ã§ã³ãŒããæžãããšã奚å±ãã¹ãã§ãã äžæ¹ã§ã¯ãããã¯ãè€éãªã³ãŒããèšè¿°ãããããã¯ãã«åãããé¢æ°ãããããé©åããªãã³ã³ããã¹ãã§ããã£ããããããšãè©Šã¿ãã¹ãã§ã¯ãªãããšãæå³ããŸãã äžæ¹ãæãæå³ã®ããå Žåã¯ãã€ã§ãããã¯ãã«åãããæ°åŠã®äœ¿çšããµããŒãããå¿ èŠããããŸãã
å®éã«ã¯ãæ°åŒãæ°å€ã®é
åã«ãããã³ã°ããããšã¯éåžžã«äžè¬çãªæäœã§ãããé¢åã«ããã®ã§ã¯ãªããããã䟿å©ã«ããããã«åªåããå¿
èŠããããŸãã ãã®ç®çã®ããã«ããã¯ãã«åãããã³ãŒãã¯äŸç¶ãšããŠæãèªç¶ã§ç°¡æœãªæ¹æ³ã§ãã ããã©ãŒãã³ã¹ã¯ããŠãããç¹ã«è€æ°ã®åŒæ°ãæã€è€ååŒã®å Žåã map
é¢æ°ãåŒã³åºããããåªããŠããŸãã
ç§ãã¡ã¯ç¢ºãã«ãã¹ãŠã®ãã¯ãã«åãããããŒãžã§ã³ãæãã§ããŸãããããã¯ãã«åããããã«æ¯åãããã䜿çšããããšã¯ãDahuaãã¡ããã©äžã§è¿°ã¹ãçç±ã®ããã«è¿·æã«ãªãã§ãããã
ããããé«éã§ããã°ããã¯ãã«åãããé¢æ°ã®ããå°ãããŠæå³ã®ããã»ãããæã€ããšã«çŠç¹ãåœãŠãããšãã§ããŸãã
ç§ã¯ç°¡æœãªå°å³è¡šèšãæ¯æããåŽã«åŒ·ãéããŠãããšèšããªããã°ãªããŸããã ç§ã¯ãããç°ãªãããŒãºã®éã®æè¯ã®åŠ¥åç¹ã ãšæããŠããŸãã
ãã¯ãã«åãããé¢æ°ã¯å¥œãã§ã¯ãããŸããã äœãèµ·ãã£ãŠããã®ããé ããŸãã é¢æ°ã®ãã¯ãã«åãããããŒãžã§ã³ãäœæãããã®ç¿æ
£ã¯ããã¹ããªãŒã³ãŒãã«ã€ãªãããŸãã ããã±ãŒãžã®é¢æ°f
ããã¯ãã«ã§åŒã³åºãããã³ãŒãããããšããŸãã é¢æ°ãäœãããŠããã®ããããçšåºŠç¥ã£ãŠããŠãããããèŠçŽ ããšã«æ©èœããã®ãããã¯ãã«å
šäœã§æ©èœããã®ããã³ãŒããèªãã§ã確信ãæãŠãŸããã ç§åŠèšç®èšèªã«ãããã®ãã¯ãã«åãããé¢æ°ãæã£ãŠããæŽå²ããªãã£ãããç§ãã¡ã¯ä»ããããã»ãšãã©åãå
¥ããŠããªããšæããŸãã
ãŸããé¢æ°ã䜿çšãããç°¡æœãªã³ãŒããæå¹ã«ããããã«ãé¢æ°ã®ãã¯ãã«åãããããŒãžã§ã³ãäœæããããã«æé»çã«æšå¥šãããç¶æ³ã«ãã€ãªãããŸãã
äœãèµ·ãã£ãŠãããã«ã€ããŠæãæ確ãªã³ãŒãã¯ã«ãŒãã§ããã @ lindahuaãèšãããã«ãããã¯éåžžã«åé·ã«ãªããç¹ã«ã€ã³ã¿ã©ã¯ãã£ããªäœ¿çšãç®çãšããèšèªã§ã¯ãç¬èªã®æ¬ ç¹ããããŸãã
ããã¯map
ã®åŠ¥åã«ã€ãªãããçæ³ã«è¿ããšæããŸãããããã§ãååã«ç°¡æœã§ã¯ãªããšãã@lindahuaã«åæããŸãã
@lindahuaã«åæããªãã®ã¯ãåè¿°ã®çç±ããããã¯ãã«åãããé¢æ°ãæè¯ã®éžæã§ãããšããããšã§ãã ç§ã®æšè«ãå°ãã®ã¯ããžã¥ãªã¢ã¯map
ã®éåžžã«ç°¡æœãªè¡šèšæ³ãæã€ã¹ãã ãšããããšã§ãã
Mathematicaããã®éèšæ³ã§ãããã©ã®ããã«è¡ãããæ¬åœã«é
åçã ãšæããŸãã Mathematicaã®åŒæ°ã«é¢æ°ãé©çšããããã®çç¥è¡šèšã¯@
ãªã®ã§ã Apply
é¢æ°f
ã次ã®ããã«ãã¯ãã«ã«å€æããŸãïŒ f @ vector
ã é¢æ°ããããã³ã°ããããã®é¢é£ããçç¥è¡šèšã¯/@
ã§ããããã f
ã次ã®ããã«ãã¯ãã«ã«ãããã³ã°ããŸãïŒ f /@ vector
ã ããã«ã¯ããã€ãã®é
åçãªç¹åŸŽããããŸãã äž¡æ¹ã®ã·ã§ãŒããã³ãã¯ç°¡æœã§ãã äž¡æ¹ã@
èšå·ã䜿çšããŠãããšããäºå®ã¯ãããããè¡ãããšã®éã«é¢ä¿ãããããšã匷調ããŠããŸããããããå
ã®/
ã¯ããããã³ã°äžãšãããã³ã°äžãæ確ã«ããããã«èŠèŠçã«åºå¥ã§ããŸããããã§ã¯ãããŸããã ããã¯ãJuliaãMathematicaã®è¡šèšæ³ãç²ç®çã«ã³ããŒããå¿
èŠããããšèšã£ãŠããã®ã§ã¯ãªãããããã³ã°ã«é©ããè¡šèšæ³ãéåžžã«äŸ¡å€ããããšããããšã ãã§ãã
ãã¹ãŠã®ãã¯ãã«åãããé¢æ°ãåãé€ãããšãææ¡ããŠããããã§ã¯ãããŸããã ãã®åè»ã¯é§ ãåºãŠãããã£ãšçµã¡ãŸããã ãããããã¯ãã«åãããé¢æ°ã®ãªã¹ããã§ããã ãçããããã¯ãã«åãããé¢æ°ã®ãªã¹ãã«è¿œå ããªãããã«ãç°¡æœãªãããè¡šèšãæäŸããããšããå§ãããŸãã
ãã¡ãããããã¯ãã¹ãŠmap
ãšç¡åé¢æ°ãé«éã§ããããšãæ¡ä»¶ãšããŠããŸãã çŸåšããžã¥ãªã¢ã¯å¥åŠãªç«å Žã«ãããŸãã ç§åŠèšç®èšèªã§ã¯ãã«ãŒããé
ãããã«é¢æ°ããã¯ãã«åãããŠããŸããã ããã¯åé¡ã§ã¯ãããŸããã 代ããã«ãJuliaã§ã¯ããããé¢æ°ãšç¡åé¢æ°ãé
ããããé¢æ°ããã¯ãã«åããŸããã ã§ããããç§ãã¡ã¯å§ãããšããã«æ»ã£ãŠããŸãããçç±ã¯ããŸããŸã§ãã
ãã¯ãã«åãããã©ã€ãã©ãªé¢æ°ã«ã¯1ã€ã®æ¬ ç¹ããããŸããã€ãŸããã©ã€ãã©ãªã«ãã£ãŠæ瀺çã«æäŸãããé¢æ°ã®ã¿ã䜿çšå¯èœã§ãã ã€ãŸããããšãã°ã sin(x)
ã¯ãã¯ãã«ã«é©çšãããšé«éã«ãªããŸããã sin(2*x)
ã¯ã2åãã©ããŒã¹ããå¿
èŠãããäžéé
åïŒæåã«æžã蟌ã¿ã次ã«èªã¿åãïŒãå¿
èŠã«ãªããããçªç¶éåžžã«é
ããªããŸãã
1ã€ã®è§£æ±ºçã¯ãvectorizABLEæ°åŠé¢æ°ã®ã©ã€ãã©ãªã§ãã ãããã¯ãã€ã³ã©ã€ã³åã®ããã«LLVMã§äœ¿çšã§ããsin
ã cos
ãªã©ã®å®è£
ã«ãªããŸãã LLVMã¯ãã®ã«ãŒãããã¯ãã«åããããšãã§ããããŸãããã°éåžžã«å¹ççãªã³ãŒãã«ã€ãªããå¯èœæ§ããããŸãã Yepppã¯æ£ããã«ãŒãã«ãŒãã«ãæã£ãŠããããã§ãããã€ã³ã©ã€ã³åã®ããã«ããããå
¬éããŠããªãããã§ãã
ãã©ãã€ã ãšããŠã®ãã¯ãã«åã«é¢ãããã1ã€ã®åé¡ã¯ãæšæºã©ã€ãã©ãªã«ãã£ãŠç¥çŠãããŠãããã®ä»¥å€ã®ã³ã³ããã¿ã€ãã䜿çšãããšããŸã£ããæ©èœããªãããšã§ãã ããã¯DataArraysã§ç¢ºèªã§ããŸããå®çŸ©ããŠããæ°ããã³ã³ãããŒã¿ã€ãã®é¢æ°ãåãã¯ãã«åããããã«äœ¿çšãããããšãã§ããªãéã®ã¡ã¿ããã°ã©ãã³ã°ã³ãŒãããããŸãã
ããã@eschnettã®ãã€ã³ããšçµã¿åããããšã次ã®ããã«ãªããŸãã
ç§ã®ãã€ã³ãã¯ããã¯ãã«åãããé¢æ°ãåžžã«ä¿æããå¿
èŠããããšããããšã§ã¯ãªãããã¯ãã«åãããé¢æ°ãäœæããã®ãšåããããç°¡æœãªæ¹æ³ãå¿
èŠã§ããããšãæ確ã«ããããšæããŸãã map
ã䜿çšããŠãããããããããæºè¶³ãããããšã¯ã§ããŸããã
@eschnettã®ããã€ãã®é¢æ°ã«_vectorizable_ã®ã¿ã°ãä»ãããšããã¢ã€ãã¢ã奜ãã§ããã³ã³ãã€ã©ãŒã¯ããŠãŒã¶ãŒããã¯ãã«åãããããŒãžã§ã³ãæ瀺çã«å®çŸ©ããªããŠãããã¯ãã«åå¯èœãªé¢æ°ãé åã«èªåçã«ãããã§ããŸãã ã³ã³ãã€ã©ãŒã¯ããã¯ãã«åå¯èœãªé¢æ°ã®ãã§ãŒã³ãèåã«ãŒãã«èåããããšãã§ããŸãã
@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_ãšããŠå®£èšããããšã¯ãå§ãã§ããŸããã
$ +
$ã®pure
ïŒ$ã¿ã°ãšassociative
ã¿ã°ãã$ sum
ã®vec
ããããã£ãã$ reduce
ã®æ¹æ³ã«é¢ããç¥èãšãšãã«åçŸã§ããŸããã§ããã foldl
/ foldr
ã pure
ããã³associative
é¢æ°ãäžãããããšãã«æ©èœããŸããïŒ æããã«ããã¯ãã¹ãŠä»®èª¬ã§ããããžã¥ãªã¢ãåã®ç¹æ§ã«å
šé¢çã«åãçµãã®ã§ããã°ãé¢æ°ã®ç¹æ§ã«ãå
šé¢çã«åãçµãããšã§ããã¯ãã«åã®æå
端æè¡ã倧å¹
ã«æ¹åããããšãæ³åã§ããŸããã
æ°ããæ§æãè¿œå ããããšã¯ãç§ãã¡ãæããã®ãšã¯éã®ããã«æããŸãïŒAny []ãšDictã®ç¹å¥ãªæ§æãåé€ããåŸïŒã ãããã®ãã¯ãã«åãããé¢æ°ãåé€ããããšã®å šäœçãª_ãã€ã³ã_ã¯ãç¹å¥ãªå Žåãæžããããšã§ãïŒãããŠãæ§æã¯é¢æ°ã®ã»ãã³ãã£ã¯ã¹ãšç°ãªãã¹ãã§ã¯ãªããšæããŸãïŒã ããããç°¡æœãªå°å³ã圹ç«ã€ããšã«åæããŸãã
ã§ã¯ãç°¡æœãªäžçœ®map
æŒç®åãè¿œå ããŠã¿ãŸãããïŒ ããã§ã¯$
ä»»æã«éžæããŸãã ããã«ããã @ lindahuaã®äŸã¯
exp(0.5 * abs2(x - y))
ã«
exp $ (0.5 * abs2 $ (x-y))
ããŠããŠãŒã¶ãŒå®çŸ©ã®äžçœ®æŒç®åã«å¯ŸããHaskellã®ãããªãµããŒããããªãå Žåãããã¯1è¡ã®å€æŽ($) = map
ãªããŸãã :)
IMOãä»ã®æ§æææ¡ã¯æ¢åã®æ§æã«èŠèŠçã«è¿ããããããã³ãŒãã調ã¹ããšãã«è§£æããã«ã¯ããã«ç²Ÿç¥çãªåªåãå¿ èŠã«ãªããŸãã
ãããŠã @vec
ãœãªã¥ãŒã·ã§ã³ã¯ãããããé¿ããããšããŠãã@vectorize
ã«è¿ãããããã«æããŸãã 確ãã«ãïŒ8297ã®æ³šéã¯ããã€ããããšäŸ¿å©ã§ãããå°æ¥çã«åœ¹ç«ã€å¯èœæ§ããããŸããããã¹ããŒããªã³ã³ãã€ã©ãŒã¯ããããã®ã¹ããªãŒã èåã®æ©äŒãèªèããããã«å¿ããŠæé©åã§ããŸãã ããããç§ã¯ããã匷å¶ãããšããèãã¯å¥œãã§ã¯ãããŸããã
äžçœ®ããããšé«éç¡åé¢æ°ãã次ã®ãããªããšãã§ããå Žåãäžæçãªãã®ã®äœæã«åœ¹ç«ã¡ãŸãã
(x, y) -> exp(0.5 * abs2(x - y)) $ x, y
ã¯ãŒã«ãªæ°ããTrait.jlã®ã¢ã€ãã¢ã¯ããã¯ãã«åå¯èœãªé¢æ°ãæå®ãããšããæèã§åããããšãã§ããã®ã ãããã ãã¡ããããã®å Žåãç¹å®ã®ç¹æ§ãæã€juliaã¿ã€ãã§ã¯ãªãã Function
ã¿ã€ãã®åã
ã®_ã€ã³ã¹ã¿ã³ã¹_ããã¯ãã«åå¯èœãã©ããã確èªããŠããŸãã
ããŠããŠãŒã¶ãŒå®çŸ©ã®äžçœ®æŒç®åã«å¯ŸããHaskellã®ãããªãµããŒããããªãã£ããšããã
ãã®è°è«ã«ã¯ãå¯èœãªéãå°ãªãé
åäžæã§åŒå
šäœããã¯ãã«åããããšã«ã€ããŠã®ãã€ã³ãããããŸãã ãã¯ãã«åãããæ§æãå¿
èŠãªãŠãŒã¶ãŒã¯ããã¯ãã«åãããexp(x)
ã ãã¯å¿
èŠãããŸããã 圌ãã¯æ¬¡ã®ãããªè¡šçŸãæžããããšæãã§ããã
y = âÏ exp(-x^2) * sin(k*x) + im * log(x-1)
éæ³ã®ããã«ãã¯ãã«åããŠããããŸã
é¢æ°ãããã¯ãã«åå¯èœããšããŠããŒã¯ããå¿ èŠã¯ãããŸããã ããã¯ããããé¢æ°ãã©ã®ããã«å®è£ ãããJuliaãå©çšã§ããããšããç¹æ§ã§ãã ããšãã°Cã§å®è£ ãããŠããå Žåã¯ãLLVMãªããã£ãã€ã¶ãåŒãç¶ãã¢ã¯ã»ã¹ã§ããããã«ãïŒãªããžã§ã¯ããã¡ã€ã«ã§ã¯ãªãïŒLLVMãã€ãã³ãŒãã«ã³ã³ãã€ã«ããå¿ èŠããããŸãã Juliaã§ããããå®è£ ããããšãæ©èœããŸãã
ãã¯ãã«åå¯èœæ§ãšã¯ãYepppãããžã§ã¯ãã§éåžžã«ãã説æãããŠããæ¹æ³ã§é¢æ°ãå®è£ ããããšãæå³ããŸããããŒããŠã§ã¢ã§ãã¯ãã«åœä»€ãšããŠäœ¿çšã§ããå Žåã¯ãåå²ãããŒãã«ãé€ç®ããŸãã¯å¹³æ¹æ ¹ã¯ãããŸãããããŒãžæäœã
æ®å¿µãªããããã®ãããªå®è£ ã¯ããŒããŠã§ã¢ã«äŸåããŸããã€ãŸããã©ã®ããŒããŠã§ã¢åœä»€ãå¹ççã§ãããã«å¿ããŠãç°ãªãã¢ã«ãŽãªãºã ãŸãã¯ç°ãªãå®è£ ãéžæããå¿ èŠãããå ŽåããããŸãã ç§ã¯éå»ã«ãããC ++ã§ïŒhttps://bitbucket.org/eschnett/vecmathlib/wiki/HomeïŒããããã«ç°ãªãã¿ãŒã²ãããªãŒãã£ãšã³ã¹ïŒèªåãã¯ãã«åã§ã¯ãªãæåã§ãã¯ãã«åãããã¹ãã³ã·ã«ããŒã¹ã®æäœïŒã§å®è¡ããŸãããã³ã³ãã€ã©ïŒã
ããJuliaã§ã¯ãïŒaïŒã³ã³ãã€ã©ãŒãLLVMã§ããããšãããã£ãŠãããïŒbïŒC ++ã®ä»£ããã«Juliaã§ãããå®è£ ã§ããããïŒãã¯ããšãã³ãã¬ãŒãïŒãäœæ¥ãç°¡åã«ãªããŸãã
ãã1ã€èæ
®ãã¹ãããšããããŸããããã¯ãIEEEæšæºã®äžéšãæŸæ£ããå Žåãé床ã倧å¹
ã«åäžãããããšãã§ãããšããããšã§ãã å€ãã®ãŠãŒã¶ãŒã¯ãããšãã°éæ£èŠåæ°ã¯éèŠã§ã¯ãªãããšããŸãã¯å
¥åãåžžã«sqrt(max(Double))
æªæºã«ãªãããšãªã©ãç¥ã£ãŠããŸããåé¡ã¯ããããã®å Žåã«é«éãã¹ãæäŸãããã©ããã§ãã ç§ã¯ããã«éåžžã«èå³ãããããšãç¥ã£ãŠããŸãããä»ã®äººã¯ä»£ããã«æ£ç¢ºã«åçŸå¯èœãªçµæãââ奜ããããããŸããã
ãžã¥ãªã¢ã§ãã¯ãã«åå¯èœãªexp
ãããã¿ã€ããäœæããŸãããã 次ã«ãLLVMãã«ãŒãããã¯ãã«åããéã«ã©ã®ããã«æ©èœããããããã³ã©ã®ãããªé床ãåŸããããã確èªã§ããŸãã
é¢æ°ã®åŒæ°ãå šå¹ æ¬åŒ§ã§å²ãã®ã¯æãããŸããïŒ
ç³ãèš³ãããŸãããã @ johnmyleswhiteãäžèšã®ç¹æ§ã§æ©èœã«ã€ããŠè©±ããŠããã®ãšãŸã£ããåãããšãç¹°ãè¿ããŠããããšã«æ°ã¥ããŸããã§ããã ç¶ããã
@eschnett APIïŒé¢æ°ããã¯ãã«åå¯èœãã©ããïŒãå®è£
ã®è©³çŽ°ïŒé¢æ°ã®ã³ã³ãã€ã«æ¹æ³ïŒã«ãªã³ã¯ããã®ã¯åççã§ã¯ãªããšæããŸãã ç解ããæéãšã¢ãŒããã¯ãã£éã§å®å®æ§ãä¿ã€ããšã¯éåžžã«è€éã«èãããŸããå€éšã©ã€ãã©ãªã§é¢æ°ãåŒã³åºãå Žåã¯æ©èœããŸãããããšãã°ã log
ã¯ãopenlibmããé¢æ°ãåŒã³åºãããããã¯ãã«åå¯èœãšããŠæ€åºãããŸããã
é¢æ°ã®æ°åŠçç¹æ§ãäŒéããããã«ç¹æ§ã䜿çšãããšããOTOH @ johnmyleswhiteã®ã¢ã€ãã¢ã¯ãåªãã解決çã«ãªãå¯èœæ§ããããŸãã ïŒ @lindahuaã®ææ¡ã¯ãç§ããã°ããåã«ææ¡ããæ©èœã§ããããã¬ã€ãã䜿çšãããœãªã¥ãŒã·ã§ã³ã¯ããã«åªããŠããå¯èœæ§ããããŸããïŒ
ããŠããŠãŒã¶ãŒå®çŸ©ã®äžçœ®æŒç®åã«å¯ŸããHaskellã®ãããªãµããŒããããªãã£ããšããã
6582ïŒ6929ååã§ã¯ãããŸãããïŒ
ç§ã¯èšãã¹ãã§ããïŒ...ãŠãŒã¶ãŒããã®ãããªã³ã¢æ©èœã«ã¢ã¯ã»ã¹ããããã«ãŠãã³ãŒãæåãå
¥åããããšãèŠæ±ããããªãã®ã§ããŠãŒã¶ãŒå®çŸ©ã®_non-unicode_äžçœ®æŒç®åã $
ã¯å®éã«è¿œå ããããã®ã®1ã€ã§ããããšãããããŸãããããããšãããããŸãã ãããŒãããã¯å®éã«ã¯Julia _today_ã§æ©èœããŸãïŒãé«éãã§ã¯ãªãå Žåã§ã...ãŸã ïŒïŒ
julia> ($) = map
julia> sin $ (0.5 * (abs2 $ (x-y)))
ãããmap
ã«æé©ãã©ããã¯ããããŸãããã $
ãxor
ã«äœ¿çšããã®ã¯æ¬åœã«ç¡é§ã«æããŸãã ãããåäœã®xorã¯ããã»ã©é »ç¹ã«ã¯äœ¿çšãããŸããã map
ã¯ã¯ããã«éèŠã§ãã
äžèšã®@jiahaoã®ãã€ã³ãã¯éåžžã«è¯ããã®ã§ãã exp
ã®ãããªåã
ã®ãã¯ãã«åãããé¢æ°ã¯ãå®éã«ã¯exp(-x^2)
ã®ãããªãã¯ãã«åããã_expressions_ãååŸããããã®äžçš®ã®ããã¯ã§ãã @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
pingã®åœ¢ç¶ãè¡šããããå€æ¬¡å
ã®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
ãã¯ãã¯ãããŸããïŒ
-erik
2014幎11æ2æ¥ååŸ8æ26åã TimHolynotifications @ github.comã¯æ¬¡ã®ããã«æžããŠããŸãã
ããã¯é¢æ°ã®ããããã£ã§ã¯ãªãã次ã®ããããã£ã§ããããšã«åæããŸãã
é¢æ°ã®äœ¿çšã ç¹æ§ã®é©çšã«é¢ããè°è«ã¯ã
ééã£ãæšãå ããå Žåããã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/JuliaLang/julia/issues/8450#issuecomment-61433026 ã
ãšãªãã¯ã·ã¥ããã¿ãŒ[email protected]
http://www.perimeterinstitute.ca/personal/eschnetter/
exp
ã®ãããªåã ã®ãã¯ãã«åãããé¢æ°ã¯ãå®éã«ã¯exp(-x^2)
ã®ãããªãã¯ãã«åããã_expressions_ãååŸããããã®äžçš®ã®ããã¯ã§ãã
ã¹ã«ã©ãŒãã¡ã€ã³ããåŒå
šäœãæã¡äžããããã®ã³ã¢æ§æã¯éåžžã«èå³æ·±ãã§ãããã ãã¯ãã«åã¯ã»ãã®äžäŸã§ãïŒã¿ãŒã²ãããã¡ã€ã³ã¯ãã¯ãã«ã§ãïŒã ãã1ã€ã®èå³æ·±ããŠãŒã¹ã±ãŒã¹ã¯ãã»ãã³ãã£ã¯ã¹ããŸã£ããç°ãªããããªãã¯ã¹ãã¡ã€ã³ïŒïŒ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ã®æ¹ãè¯ãã§ããããïŒ
åïŒå±éããŸããjulia -usersã«é¢ãã@toivohã®æçš¿ãåç §ããŠãã ããã ïŒ6271ãè©ŠããŠã¿ã䟡å€ããããããããŸããã
@nalimilanããã«ã€ããŠã¯ãŸã èããŠããŸããããã¹ã«ã©ãŒ->è¡åã®ãªããã£ã³ã°ã¯ãåäžã®matrixfunc
é¢æ°ïŒããšãã°ïŒã䜿çšããŠå®è£
ããã®ã¯éåžžã«ç°¡åã§ãã 1ã€ã®ä»®æ³æ§æïŒå®å
šã«äœããæ§æããïŒã¯æ¬¡ã®ããã«ãªããŸãã
X = randn(10,10)
c = 0.7
lift(x->exp(c*x^2)*sin(x), X)
ãããªã
X
ãããªããã®ãœãŒã¹ãã¡ã€ã³ãšã¿ãŒã²ãããã¡ã€ã³ãç¹å®ããŸããã¿ã€ãMatrix{Float64}
ã§ãèŠçŽ ïŒã¿ã€ããã©ã¡ãŒã¿ãŒïŒ Float64
ã§ãïŒãããã£ãŠãæé»çã«Float64 => Matrix{Float64}
ãªãããå®çŸ©ããŸãïŒ ã ããããmatrixfunc(x->exp(c*x^2)*sin(x), X)
ãåŒã³åºããŠã expm(c*X^2)*sinm(X)
ã«çžåœãããã®ãèšç®ããŸãããè¡åã®ä¹ç®ã¯é¿ããŸããä»ã®ã³ãŒãã§ã¯ã X
ã¯Vector{Int}
ã§ãããæé»ã®ãªããã£ã³ã°ã¯Int
ããVector{Int}
ã«ãªãã lift(x->exp(c*x^2)*sin(x), X)
ã¯$ïŒ$ 12 $ïŒ$ã«ãªããŸãã map(x->exp(c*x^2)*sin(x), X)
ãåŒã³åºããŸãã
ãœãŒã¹ãã¡ã€ã³ãšã¿ãŒã²ãããã¡ã€ã³ãæ瀺çã«æå®ããä»ã®ã¡ãœãããããšãã°lift(Number=>Matrix, x->exp(c*x^2)*sin(x), X)
ãæ³åã§ããŸãã
@nalimilan Vectorizationã¯ãå®éã«ã¯APIã®ããããã£ã§ã¯ãããŸããã ä»æ¥ã®ã³ã³ãã€ã©æè¡ã§ã¯ãé¢æ°ã¯ã€ã³ã©ã€ã³ã®å Žåã«ã®ã¿ãã¯ãã«åã§ããŸãã ç©äºã¯äž»ã«é¢æ°ã®å®è£ ã«äŸåããŸã-ããããæ£ããæ¹æ³ãã§æžãããŠããå Žåãã³ã³ãã€ã©ã¯ããããã¯ãã«åã§ããŸãïŒåšå²ã®ã«ãŒãã«ã€ã³ã©ã€ã³åããåŸïŒã
@eschnett ïŒä»ã®äººãšåãæå³ã®ãã¯ãã«åã䜿çšããŠããŸããïŒ ããªãã¯SIMDãªã©ã«ã€ããŠè©±ããŠããããã§ãããããã¯ç§ã@nalimilanã®æå³ãç解ããŠããããšã§ã¯ãããŸããã
å³ã ããã§ã¯ããã¯ãã«åã®2ã€ã®ç°ãªãæŠå¿µããããŸãã 1ã€ã®ååŒ
ã¿ã€ããªå
éšã«ãŒãïŒããã»ããµã®ãã¯ãã«åïŒã®ããã«SIMDãååŸããŸãã ã¡ã€ã³
ããã§è°è«ãããŠããåé¡ã¯ãã©ãããããããèªåçã«ãã®æ§æ/æå³è«ã§ã
ã³ã¬ã¯ã·ã§ã³ã§åäžïŒãŸãã¯è€æ°ïŒã®åŒæ°é¢æ°ãåŒã³åºãããšãã§ããã
2014幎11æ4æ¥ç«ææ¥ååŸ7æ4åããžã§ã³ãã€ã«ãºãã¯ã€ã[email protected]
æžããŸããïŒ
@eschnett https://github.com/eschnett ïŒåãæå³ã䜿çšããŠããŸãã
ä»ã®äººãšããŠã®ãã¯ãã«åã®ïŒ SIMDãªã©ã®è©±ã®ããã§ããã
ç§ãç解ããŠããããšã§ã¯ãããŸãã@nalimilanhttps ïŒ//github.com/nalimilan to
å¹³åãâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/JuliaLang/julia/issues/8450#issuecomment-61738237 ã
ä»ã®.
æŒç®åãšå¯Ÿç§°çã«ã f.(x)
ã¯é¢æ°ã®ã³ã¬ã¯ã·ã§ã³ãå€ã®ã³ã¬ã¯ã·ã§ã³ã«é©çšãã¹ãã§ã¯ãããŸãããïŒ ïŒããšãã°ãããndåäœåº§æšç³»ããç©ç座æšã«å€æããå ŽåãïŒ
æ§æã«ã€ããŠèª¬æããŠãããšãã«ãæ瀺çãªã«ãŒãã䜿çšããŠmap(log, x)
ã«çžåœãããã®ãè¡šçŸããã®ã¯é
ããããšããæŠå¿µãæµ®ãã³ãŸããã ãããã£ãŠããããååã«é«éåã§ããå Žåã¯ã map
ã®åŒã³åºãïŒãŸãã¯ç¹å¥ãªæ§æã®äœ¿çšïŒãŸãã¯ã«ãŒãã®èšè¿°ã¯ã»ãã³ãã£ãã¯ã¬ãã«ã§åçã§ãããæ§æã®ææ§æ§è§£æ¶ãå°å
¥ããå¿
èŠã¯ãããŸããã çŸåšãvector-logé¢æ°ãåŒã³åºãããšã¯ãé
åäžã«ã«ãŒããäœæãããããã¯ããã«é«éã§ãããã³ãŒãã§ãã®åºå¥ãè¡šçŸããæ¹æ³ãæ±ããããã«äººã
ã«ä¿ããŸãã
ããã«ã¯2ã€ã®ã¬ãã«ã®åé¡ããããŸãïŒïŒ1ïŒæ§æãšã»ãã³ãã£ã¯ã¹ãïŒ2ïŒå®è£ ã
æ§æãšã»ãã³ãã£ã¯ã¹ã®åé¡ã¯ãç¹å®ã®èšç®ãèŠçŽ ããš/ãããŒããã£ã¹ãæ¹åŒã§ç¹å®ã®é
åã«ãããã³ã°ããæå³ããŠãŒã¶ãŒãã©ã®ããã«è¡šçŸã§ãããã«é¢ãããã®ã§ãã çŸåšãJuliaã¯2ã€ã®æ¹æ³ããµããŒãããŠããŸãããã¯ãã«åãããé¢æ°ã䜿çšããæ¹æ³ãšããŠãŒã¶ãŒãã«ãŒããæ瀺çã«èšè¿°ã§ããããã«ããæ¹æ³ã§ãïŒãã¯ãã䜿çšããå ŽåããããŸãïŒã ã©ã¡ãã®æ¹æ³ãçæ³çã§ã¯ãããŸããã ãã¯ãã«åãããé¢æ°ã䜿çšãããšã exp(0.5 * (x - y).^2)
ã®ãããªéåžžã«ç°¡æœãªåŒãèšè¿°ã§ããŸããã2ã€ã®åé¡ããããŸããéçºè
åŽã§ã®æãŠããªãè°è«ãšãŠãŒã¶ãŒåŽã§ã®æ··ä¹±ïŒç¹å®ã®é¢æ°ããã¯ãã«åãããŠãããã©ãããç解ããããã«ããã¥ã¡ã³ããæ€çŽ¢ããå¿
èŠãããããšããããããŸãïŒã ïŒ2ïŒæ©èœã®å¢çãè¶ããŠã«ãŒããèåããããšãå°é£ã«ããŸãã ãã®æç¹ã§ãããããæ°ãæ/幎åŸã«ãã³ã³ãã€ã©ã¯ãè€æ°ã®é¢æ°ãäžç·ã«èª¿ã¹ãããçµåããŒã¿ãããŒãèå¥ããããé¢æ°ã®å¢çãè¶ããŠæé©åãããã³ãŒããã¹ãçæããããããªã©ã®è€éãªã¿ã¹ã¯ãå®è¡ã§ããªããªãå¯èœæ§ããããŸãã
map
é¢æ°ã䜿çšãããšãããã§åé¡ïŒ1ïŒã«å¯ŸåŠã§ããŸãã ãã ããããã§ãåé¡ã®è§£æ±ºã«ã¯åœ¹ç«ã¡ãŸããïŒ2ïŒ-ç¹å®ã®ãã¯ãã«åãããé¢æ°ãŸãã¯äžè¬çãªmap
ã®ããããã®é¢æ°ã䜿çšãããšãã«ãŒãã®èåã劚ããé¢æ°å¢çãåžžã«äœæãããŸããé«æ§èœèšç®ã§ã¯éèŠã§ãã mapé¢æ°ã䜿çšãããšãåé·æ§ãçããŸããããšãã°ãäžèšã®åŒã¯map(exp, 0.5 * map(abs2, x - y))
ã®ããã«é·ãã¹ããŒãã¡ã³ãã«ãªããŸãã ãã®åé¡ã¯ãããè€éãªè¡šçŸã§æªåããããšãåççã«æ³åã§ããŸãã
ãã®ã¹ã¬ããã§æŠèª¬ãããŠãããã¹ãŠã®ææ¡ã®äžã§ãç§ã¯å人çã«ããããã³ã°ã瀺ãããã«ç¹å¥ãªè¡šèšã䜿çšããããšããä»åŸæãææãªæ¹æ³ã§ãããšæããŠããŸãã ãŸã第äžã«ãããã¯è¡šçŸã®ç°¡æœããç¶æããŸãã $è¡šèšãäŸã«ãšããšãäžèšã®åŒã¯exp $(0.5 * abs2$(x - y))
ãšæžãããšãã§ããŸãã ããã¯å
ã®ãã¯ãã«åãããåŒãããå°ãé·ãã§ãããããã»ã©æªãã¯ãããŸãããå¿
èŠãªã®ã¯ããããã³ã°ã®ååŒã³åºãã«$
ãæ¿å
¥ããããšã ãã§ãã äžæ¹ããã®è¡šèšã¯ãå®è¡ãããŠãããããã³ã°ã®æ確ãªã€ã³ãžã±ãŒã¿ãŒãšããŠãæ©èœããŸããããã䜿çšããŠãã³ã³ãã€ã©ãŒã¯é¢æ°ã®å¢çãç Žããèåã«ãŒããçæã§ããŸãã ãã®ã³ãŒã¹ã§ã¯ãã³ã³ãã€ã©ãŒã¯é¢æ°ã®å
éšå®è£
ã調ã¹ãå¿
èŠã¯ãããŸãããç¥ã£ãŠããå¿
èŠãããã®ã¯ãé¢æ°ãæå®ãããé
åã®åèŠçŽ ã«ããããããããšã ãã§ãã
ææ°ã®CPUã®ãã¹ãŠã®æ©èœãç¹ã«SIMDã®æ©èœãèãããšãè€æ°ã®ã«ãŒãã1ã€ã«èåããããšã¯ãé«æ§èœèšç®ã«åãã1ã€ã®ã¹ãããã«ãããŸããã ãã®ã¹ãããèªäœã¯ãSIMDåœä»€ã®å©çšãããªã¬ãŒããŸããã 幞ããªããšã«ã @simd
ãã¯ããã§ããŸããã ã³ã³ãã€ã©ãŒã¯ãå®å
šã§æçã§ãããšå€æããå Žåã«ãçæãããã«ãŒãã®å
é ã«ãã®ãã¯ããæ¿å
¥ã§ããŸãã
èŠçŽãããšã$è¡šèšïŒãŸãã¯åæ§ã®ææ¡ïŒã¯ãã³ã³ãã€ã©ãã«ãŒããèåããŠSIMDã掻çšããããã©ãŒãã³ã¹ã®é«ãã³ãŒããçæããããã«å¿ èŠãªæ å ±ãæäŸããªãããæ§æãšã»ãã³ãã£ã¯ã¹ã®åé¡ã«å€§éšå察åŠã§ãããšæããŸãã
@lindahuaã®èŠçŽã¯ç§èŠã®è¯ããã®ã§ãã
ãããããããããã«æ¡åŒµããããšã¯èå³æ·±ããšæããŸãã ãžã¥ãªã¢ã¯ãå€ãã®äžè¬çãªãã¿ãŒã³ãå±éãããã«ãŒããšåããããå¹ççã«ããéå¿çãªã·ã¹ãã ã«å€ããŸãã
A .* B .+ C
ã¯2ã€ã®äžæçãªãã®ãäœæãããçµæãšããŠ1ã€ã ããäœæããŸããsumabs2(A)
ãåé€ãã sum(abs$(A)$^2)
ïŒãŸãã¯sum(abs.(A).^2)
ïŒãªã©ã®æšæºè¡šèšã«çœ®ãæããããšãã§ããŸããA .* B
ã¯éãŒãã®ãšã³ããªã®ã¿ãåŠçããã¹ããŒã¹è¡åãè¿ããŸãã ããã¯ãèŠçŽ ããšã®é¢æ°ãSet
ã Dict
ããŸãã¯Range
ã«é©çšããå Žåã«ã圹ç«ã¡ãŸããæåŸã®2ã€ã®ãã€ã³ãã¯ãèŠçŽ ããšã®é¢æ°ãç¹å¥ãªAbstractArray
åãè¿ãããã«ããããšã§æ©èœããŸããããšãã°ã LazyArray
ã¯ããã®èŠçŽ ããã®å Žã§èšç®ããŸãïŒ Transpose
ãšåæ§ïŒã https://github.com/JuliaLang/julia/issues/4774#issuecomment-59422003ããå
¥åããŸãïŒã ãã ãã 1
ããlength(A)
ãŸã§ã®ç·åœ¢ã€ã³ããã¯ã¹ã䜿çšããŠèŠçŽ ã«åçŽã«ã¢ã¯ã»ã¹ãã代ããã«ãã€ãã¬ãŒã¿ãããã³ã«ã䜿çšã§ããŸãã ç¹å®ã®ã¿ã€ãã®ã€ãã¬ãŒã¿ã¯ãã¿ã€ãã®ã¹ãã¬ãŒãžã¬ã€ã¢ãŠãã«å¿ããŠãè¡åäœãŸãã¯ååäœã®å埩ãæãå¹ççãã©ãããèªåçã«éžæããŸãã ãŸããã¹ããŒã¹è¡åã®å ŽåããŒããšã³ããªãã¹ãããã§ããŸãïŒå
ã®ãšã³ããªãšçµæã¯å
±éã®æ§é ãæã€å¿
èŠããããŸããhttpsïŒ//github.com/JuliaLang/julia/issues/7010ãhttpsïŒ// githubãåç
§ããŠãã ããã com / JuliaLang / julia / issues / 7157ïŒã
ãªãã¯ã·ã§ã³ãé©çšãããŠããªãå Žåãå
ã®ãªããžã§ã¯ããšåãã¿ã€ããšåœ¢ç¶ã®ãªããžã§ã¯ãã¯ã LazyArray
ïŒ collect
ã«çžåœããŸãããå
ã®é
åã®ã¿ã€ããå°éããŸãïŒãå埩åŠçããã ãã§åããããŸãã ïŒã ãã®ããã«å¿
èŠãªã®ã¯ãã€ãã¬ãŒã¿ããªããžã§ã¯ããè¿ãããšã ãã§ãããã®ãªããžã§ã¯ãã䜿çšããŠã LazyArray
ã§getindex
ãåŒã³åºããçµæã§setindex!
ãåŒã³åºãããšãã§ããŸãïŒç·åœ¢ãŸãã¯ãã«ã«ã座æšãªã©ïŒã座æšïŒã
ãªãã¯ã·ã§ã³ãé©çšããããšãåŒæ°ã«é¢é£ããå埩æ³ã䜿çšããŠã LazyArray
ã®å¿
èŠãªæ¬¡å
ãå埩åŠçããé
åã«çµæãå
¥åããŸãïŒ reduce
ã«çžåœããŸãããé
åã¿ã€ãã«é©å¿ããã«ã¹ã¿ã ã€ãã¬ãŒã¿ïŒã 1ã€ã®é¢æ°ïŒæåŸã®æ®µèœã§äœ¿çšãããŠããé¢æ°ïŒã¯ãæãå¹ççãªæ¹æ³ã§ãã¹ãŠã®èŠçŽ ãåŠçããã€ãã¬ãŒã¿ãŒãè¿ããŸãã ä»ã®äººã¯ç¹å®ã®æ¬¡å
ã§ããããããšãèš±å¯ããã§ãããã
ãã®ã·ã¹ãã å šäœã¯ãã€ã³ãã¬ãŒã¹æäœãéåžžã«ç°¡åã«ãµããŒãããŸãã
æ§æã«å¯ŸåŠããããšã«ã€ããŠå°ãèããŠããŠãèŠçŽ ããšã®æäœãé
åã«é©çšããããã®.=
ã«ã€ããŠèããŸããã
ãããã£ãŠã @ nalimilanã®äŸsum(abs.(A).^2))
ã¯ãæ®å¿µãªãã2ã€ã®ã¹ãããã§èšè¿°ããå¿
èŠããããŸãã
A = [1,2,3,4]
a .= abs(A)^2
result = sum(a)
ããã«ã¯èªã¿ããããšããå©ç¹ããããé ååºæã®ã¡ãœãããèšè¿°ãã代ããã«ãèŠçŽ ããšã®é¢æ°ãåäžïŒãŸãã¯è€æ°ïŒã®å ¥åã«å¯ŸããŠèšè¿°ãããã®å Žåã«æé©åããã ãã§ããããšãæå³ããŸãã
ãã¡ãããããã©ãŒãã³ã¹ãšèŠªãã¿ããã以å€ã®äœç©ããè¿°ã¹ãããŠããããã«ã誰ããä»ããmap((x) -> abs(x)^2, A)
ãæžãããšã劚ãããã®ã§ã¯ãããŸããã
ãŸãã¯ã .()
ã§ãããããåŒãå²ãããšãã§ããŸãã
ãããè¡ãã®ãã©ãã»ã©é£ãããã¯ããããŸãããã .sin(x)
ãš.(x + sin(x))
ã¯ãæ¬åŒ§å
ãŸãã¯.
ã«ç¶ãé¢æ°ã®ããããã§åŒããããããŸãã
ããã«ããã @ nalimilanã®äŸã®ããã«ã sum(.(abs(A)^2))
ã1è¡ã§æžã蟌ãããšãã§ããããã«ãªããŸãã
ãããã®ææ¡ã¯äž¡æ¹ãšã.
ãã¬ãã£ãã¯ã¹ã䜿çšããŠãããå
éšã§ãããŒããã£ã¹ãã䜿çšããŠãããšãã«ãé
åã®èŠçŽ ããšã®æäœã«ã€ããŠèããããããŸããã ããã¯ã $
ãŸãã¯å¥ã®èšå·ãšç°¡åã«äº€æã§ããŸãã
ããã¯ããããããããã¹ãŠã®é¢æ°ã®åšãã«ãããæŒç®åãé
眮ãã代ããã«åŒå
šäœãã°ã«ãŒãåããŠã代ããã«ããããããããã«æå®ãã代ããã®æ¹æ³ã§ãã
ç§ã¯æåŸã®ã³ã¡ã³ãã§å
¬éããLazyArray
ã®ã¢ã€ãã¢ãè©ŠããŸããïŒ https ïŒ//gist.github.com/nalimilan/e737bc8b3b10288abdad
ãã®æŠå¿µå®èšŒã«ã¯æ§æäžã®ç³è¡£ã¯ãããŸãããã (a ./ 2).^2
ã¯ãèŠç¹ã«LazyArray(LazyArray(a, /, (2,)), ^, (2,))
ãšæžãããŠãããã®ã«å€æãããŸãã ã·ã¹ãã ã¯éåžžã«ããŸãæ©èœããŸãããããã©ãŒãã³ã¹ã«é¢ããŠã«ãŒããšãªã¢ãŒãã§ç«¶åããã«ã¯ãããã«æé©åããå¿
èŠããããŸãã ïŒäºæ³ãããïŒåé¡ã¯ãè¿œå ã®åŒæ°ãèš±å¯ãããŠããªãããŒãžã§ã³ã§ãã12è¡ç®ã®é¢æ°åŒã³åºããæé©åãããŠããªãïŒã»ãšãã©ãã¹ãŠã®å²ãåœãŠãããã§è¡ãããïŒããšã§ããããã§ãã åŒã³åºãé¢æ°ã®LazyArray
ããã©ã¡ãŒã¿ãŒåããå¿
èŠããããšæããŸãããåŒæ°ã®åŠçã¯èšããŸã§ããªãããããã©ã®ããã«å®è¡ã§ãããããããŸããã äœãæ¡ã¯ïŒ
LazyArray
ã®ããã©ãŒãã³ã¹ãæ¹åããæ¹æ³ã«ã€ããŠäœãææ¡ã¯ãããŸããïŒ
@nalimilan 1幎åã«åæ§ã®ã¢ãããŒããè©ŠããNumericFunsã®ãã¡ã³ã¯ã¿ãŒåã䜿çšããŠé 延åŒã®åããã©ã¡ãŒã¿ãŒåããŸããã ããŸããŸãªããªãã¯ãè©ŠããŸããããããã©ãŒãã³ã¹ã®ã®ã£ãããåããããšãã§ããŸããã§ããã
ã³ã³ãã€ã©ã®æé©åã¯ãéå»1幎éã§åŸã
ã«æ¹åãããŠããŸããã ããããããã§ãäžèŠãªãªãŒããŒããããæé©åããããšã¯ã§ããªããšæããŠããŸãã ãã®çš®ã®ããšã¯ãã³ã³ãã€ã©ãŒãç©æ¥µçãªã€ã³ã©ã€ã³é¢æ°ãå¿
èŠãšããŸãã @inline
ã䜿çšããŠã¿ãŠãç¶æ³ãæ¹åããããã©ããã確èªããŠãã ããã
@lindahua @inline
ã¯ã¿ã€ãã³ã°ã«éãã¯ãããŸãããããã¯ã getindex(::LazyArray, ...)
ãç¹å®ã®LazyArray
眲åã«ç¹åããŠãããããè«ççã§ããããã¯ãã©ã®é¢æ°ãæå®ããå¿
èŠãããããæå®ããŸãããåŒã°ããã LazyArray{T1, N, T2, F}
ã®ãããªãã®ãå¿
èŠã§ããFã¯åŒã³åºãããé¢æ°ãªã®ã§ã getindex
ãã³ã³ãã€ã«ãããšãã«åŒã³åºããããããŸãã ãããè¡ãæ¹æ³ã¯ãããŸããïŒ
ã€ã³ã©ã€ã³åã¯ããã«ãã1ã€ã®å€§ããªæ¹åã§ãããçŸæç¹ã§ã¯ãã€ã³ã©ã€ã³åãããŠããªãåŒã³åºããããã¿ã€ãã³ã°ãã¯ããã«æªããªã£ãŠããŸãã
NumericFuns
ã®äœ¿çšãæ€èšããããšãã§ãã F
ã¯ãã¡ã³ã¯ã¿ãŒã¿ã€ãã«ããããšãã§ããŸãã
Dahua
åæ£ã®ãªã¿ãŒã³ã¿ã€ããããã£ãŠããé¢æ°ãå¿
èŠã§ãã
çµæã®åã«çµæãžã®åç
§ãäœæããã³ã³ãã¥ãŒãã£ã³ã°ïŒããã³
ãããã£ãŠããã®ã¿ã€ãïŒã¯æ¢ç¥ã§ãã ç§ã¯èªåã§éåžžã«ãã䌌ããã®ãå®è£
ããŸããããããŠ
ããããããã¡ã³ã¯ã¿ãŒããšåŒã°ãããã®ã䜿çšããããã«åãæ¿ããå¿
èŠããããŸãã ïŒç§ã¯å¥œãã§ã¯ãããŸãã
éåžžã¯å¥ã®ãã®ã§ãããããããã¡ã³ã¯ã¿ãŒããšããååãä»ããŸã<
http://en.wikipedia.org/wiki/Functor>ã§ãããC ++ãæ°Žãæ··ä¹±ããããšæããŸã
ãããïŒ
ãã¡ã³ã¯ã¿ãŒã®éšåãããåå²ããã®ã¯çã«ããªã£ãŠãããšæããŸã
æ°åŠé¢æ°ã
-erik
2014幎11æ20æ¥æšææ¥åå10æ35åãDahua [email protected]
æžããŸããïŒ
NumericFunsã®äœ¿çšãæ€èšããããšãã§ããFã¯ãã¡ã³ã¯ã¿ãŒã¿ã€ãã«ããããšãã§ããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/JuliaLang/julia/issues/8450#issuecomment-63826019 ã
ãšãªãã¯ã·ã¥ããã¿ãŒ[email protected]
http://www.perimeterinstitute.ca/personal/eschnetter/
@lindahuaãã¡ã³ã¯ã¿ãŒã䜿çšããŠã¿ãŸããããå®éãããã©ãŒãã³ã¹ã¯ã¯ããã«åççã§ãã
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
ã䜿çšãããšåœ¹ç«ã€å ŽåããããŸãïŒé©åãªå ŽåïŒã
2ã€ã®é£ç¶ããè¡ãmov RAX, ...
ã§å§ãŸã以äžã®éšåã¯ãäºééæ¥åç
§ã§ããã€ãŸãããã€ã³ã¿ãŒïŒãŸãã¯é
åã®é
åããŸãã¯é
åãžã®ãã€ã³ã¿ãŒãªã©ïŒãžã®ãã€ã³ã¿ãŒã«ã¢ã¯ã»ã¹ããŸãã ããã¯ãLazyArrayã®å
éšè¡šçŸã«é¢ä¿ããŠããå¯èœæ§ããããŸãããããããäžå€ã䜿çšããïŒãŸãã¯Juliaã«ãã£ãŠäžå€ãå¥ã®æ¹æ³ã§è¡šçŸããïŒããšãããã§åœ¹ç«ã€å ŽåããããŸãã
ãããã«ãããã³ãŒãã¯ãŸã ããªãé«éã§ãã é«éåããã«ã¯ãåŒã³åºãå ã«ã€ã³ã©ã€ã³åããŠãããã«æé©åã®æ©äŒãå ¬éããå¿ èŠããããŸãã ãã®åŒãã«ãŒããªã©ããåŒã³åºããšã©ããªããŸããïŒ
ãŸãããããREPLããã§ã¯ãªããé¢æ°å ããéã¢ã»ã³ãã«ãããšã©ããªããŸããïŒ
ãŸããæåã®ããŒãžã§ã³ãå®éã«å®è¡ãããããšã«æ°ä»ããã«ã¯ããããŸãã
2çªç®ã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åŸè ã®å Žåãé€ç®ãåçŽåãããŠããªãããšã説æã§ããã®ã¯äœã§ããïŒ
ç§ã¯2ã€ã®åŒæ°ã®ããŒãžã§ã³ïŒ 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)
ãããã£ãŠããã®æŠç¥ã¯ã .+
ã .*
ãªã©ã®æŒç®åãå«ããã¹ãŠã®èŠçŽ ããšã®æŒç®ã眮ãæããããšãå®è¡å¯èœã§ããããã«èŠããŸãã
ãŸããè¡åã®æ¬¡å
ã«æ²¿ã£ãå·®ã®2ä¹ã®åèšãã€ãŸã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ããããšãã ããã¯ç¢ºãã«äŒŒãŠããŸããããžã¥ãªã¢ãåœä»€ã¢ãã«ã䜿çšããŠãããããããè€éã§ãã ããã©ããããHaskellã§ã¯ãã³ã³ãã€ã©ã¯ããŸããŸãªã±ãŒã¹ãåŠçããå¿ èŠããããSIMDã®åé¡ïŒJuliaã®åŸã®æç¹ã§LLVMã«ãã£ãŠåŠçãããïŒãåŠçããå¿ èŠããããŸãã ããããæ£çŽãªãšããããããã®è«æã®ãã¹ãŠã解æããããšã¯ã§ããŸããã
@nalimilanç§ã¯ãã®æ°æã¡ãç¥ã£ãŠããŸãã 2çªç®ã®è«æã¯ãäžè¬åãããã¹ããªãŒã ãã¥ãŒãžã§ã³ã«ã€ããŠèª¬æããŠãããããç¹ã«èå³æ·±ããšæããŸãããããã«ããããã¯ãã«ã«å¯Ÿããåªããèšç®ã¢ãã«ãå¯èœã«ãªãããã§ãã
æ æ°ãšçµã¿åãããmap
ãreduce
ã®ãããªæ§æã¯ãååã«é«éïŒãŸãã¯æ瀺çãªã«ãŒããããããã«é«éïŒã«ãªãå¯èœæ§ããããšããããšãããç§ãã¡ãåãã¹ãäž»ãªãã€ã³ãã ãšæããŸãã
ç§ãç¥ãéããäžæ¬åŒ§ã¯åŒã³åºãæ§æã§åŒãç¶ã䜿çšã§ããŸãã ãããfunc{x}
ã«ãªã£ãå Žåã¯ã©ããªããŸããïŒ å€åå°ãç¡é§ãããŸããïŒ
ïŒSIMDã®æå³ã§ã®ïŒé«éãã¯ãã«åã®ãããã¯ã«é¢ããŠãEigenãè¡ãæ¹æ³ããšãã¥ã¬ãŒãã§ããæ¹æ³ã¯ãããŸããïŒ
ããã¯ãçŸåšã®ãã¹ãŠã®èŠçŽ ããšã®æäœããäžèšã®LazyArray
ããã³LazyArray2
ãšåŒãã ãã®ã®äžè¬åã«çœ®ãæããææ¡ã§ãã ãã¡ãããããã¯ãNumericFuns.jlã®ãã¡ã³ã¯ã¿ãŒã«äŸåããããšãªãããã¹ãŠã®é¢æ°ã§ãããé«éåã§ãããšããåæã«åºã¥ããŠããŸãã
1ïŒæ°ããæ§æf.(x)
ãŸãã¯f$(x)
ããŸãã¯x
f()
LazyArray
ãäœæãããã®ãè¿œå ããŸãã
2ïŒ broadcast
ãçŸåšã©ã®ããã«æ©èœãããã«åŸã£ãŠããã®æ§æãäžè¬åããŸããããšãã°ã f.(x, y, ...)
ãŸãã¯f$(x, y, ...)
ã¯LazyArray
$ãäœæããŸãããã·ã³ã°ã«ãã³æ¬¡å
ãx
ã«æ¡åŒµããŸãã y
ã...ãããã«å
±éã®ãµã€ãºãäžããããã ãã¡ãããããã¯ã€ã³ããã¯ã¹ã®èšç®ã«ãã£ãŠãªã³ã¶ãã©ã€ã§å®è¡ããããããæ¡åŒµãããé
åã¯å®éã«ã¯å²ãåœãŠãããŸããã
3ïŒ .+
ã .-
ã .*
ã ./
ã .^
ãªã©ãäœæããŸãã$ã®ä»£ããã«broadcast
LazyArray
ã䜿çšããŸãã broadcast
ã
4ïŒæ°ãã代å
¥æŒç®å.=
ãŸãã¯$=
ãå°å
¥ããŸããããã«ããã LazyArray
ãå®éã®é
åã«å€æãããŸãïŒ collect
ãåŒã³åºããŸãïŒãããã¢ãŒã·ã§ã³ã«ãŒã«ãä»ããå
¥åãããã³å
¥åã®èŠçŽ ã¿ã€ããšåŒã³åºãããé¢æ°ã«å¿ããèŠçŽ ã¿ã€ãïŒã
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æåé·ããªããŸãã ç§ã¯ãããããã¹ãŠã®ãããããããã»ãšãã©ã®å Žåãçç¥ãããç解æ§æã䜿çšããããšæããŸãã
1次å
ã®ç解ã¯åœ¢ãç¶æããŸããããä»ã§ã¯for i in eachindex(x)
ãå€æŽãããå¯èœæ§ããããŸãã
å å è¡šèšã®åé¡ã®1ã€ã¯ãããŒã¿é åããµããŒãããŠããªãããšã§ãã
LazyArrayã®ã¢ã€ãã¢ã«éåžžã«ãã䌌ã.Netã§èµ·ãã£ãããããã®ããšãèŠã䟡å€ããããšæããŸãã åºæ¬çã«ãããã¯LINQã¹ã¿ã€ã«ã®ã¢ãããŒãã«éåžžã«è¿ãããã«èŠããŸããããã§ã¯ãçŸåšã®èŠçŽ ããšã®æ§æã«äŒŒãŠããŸãããå®éã«ã¯ãã®æ§æã«ãã£ãŠåŒããªãŒãæ§ç¯ããããã®åŒããªãŒã¯åŸã§å¹ççãªæ¹æ³ã§è©äŸ¡ãããŸãã ã ããã¯ã©ããããããè¿ãã§ããïŒ
.Netã§ã¯ããããã®åŒããªãŒãè€æ°ã®CPUã§äžŠåã«å®è¡ããïŒ.AsParallelïŒïŒãè¿œå ããïŒããDryadLINQã䜿çšããŠå€§èŠæš¡ãªã¯ã©ã¹ã¿ãŒã§å®è¡ãããã httpïŒ/ã§å®è¡ããããšãã§ããŸãã
ç§ã®æèŠã§ã¯ãBlazeããã®æ¹åã«é²ãã§ããŸããã€ãŸããèšç®ãèšè¿°ãããªããžã§ã¯ããç°¡åã«æ§ç¯ããæ¹æ³ã§ããããããã°ãããŸããŸãªå®è¡ãšã³ãžã³ã䜿çšã§ããŸãã
ãããéåžžã«æ確ãã©ããã¯ããããŸãããããã®åé¡å šäœã¯ãã³ãŒãã®ãããªäœã¬ãã«ã®å¹ççãªSIMDãçæããæ¹æ³ãšããããGPUã³ã³ãã¥ãŒãã£ã³ã°ãã¯ã©ã¹ã¿ãªã³ã°ã䞊åã«äœ¿çšããæ¹æ³ã®äž¡æ¹ã®ã³ã³ããã¹ãã§æ€èšããå¿ èŠãããããã«æãããŸãèšç®ãªã©ã
ã¯ãããã®éãã§ããé·ãäŸã§ã¯ããããå€ãããŸãã ãã ãã2ã€ã®çãæ¹ãäžè¬çã§ããããã®å Žåã¯çãæ§æã䜿çšããããšãéèŠã§ãã æ§æãæ æ°ããåé¢ãããã®ã§ãããããªãã®ã³ã¡ã³ãããããéåžžã«é£ããããã«èŠããããšã瀺ããŠããã®ã§ãç§ãã¡ã¯åžžã«2ã€ãæ··ãåãããŸãïŒ
y = [sqrt(x + 2) over x]
ã®ãããªç解æ§æãé©å¿ãããããšãæ³åããããšãã§ããŸãã ãããã @ johnmyleswhiteãææããããã«ã DataArrays
ã ãã§ãªããã¹ããŒã¹è¡åãæ°ããé
ååããµããŒãããå¿
èŠããããŸãã ãããã£ãŠããããæ§æãšæ©èœãæ··åšãããå Žåã§ãã
ããåºæ¬çã«ã¯ãç§ã®ææ¡ã代æ¿æ¡ã«å¯ŸããŠæäŸãã2ã€ã®æ©èœã¯æ¬¡ã®ãšããã§ãã
1ïŒ y[:] = sqrt.(x .+ 2)
ã䜿çšããå²ãåœãŠãªãã®ã€ã³ãã¬ãŒã¹å²ãåœãŠã®ãµããŒãã
2ïŒ sum((x .- y).^2, 1)
ã®ãããªå²ãåœãŠã®ãªãåæžã®ãµããŒãã
ããã¯ä»ã®è§£æ±ºçïŒæ§æã®åé¡ãç¡èŠããŠïŒã§æäŸã§ããŸããïŒ
@davidanthoffããããšãããããŸããä»èŠãŠãã ããïŒäžŠåã³ã³ãã¥ãŒãã£ã³ã°ããµããŒãããããã«LazyArray
ãäœæã§ãããšæããŸãïŒã
ãããããããã¯ãžã§ãã¬ãŒã¿ãŒãšçµã¿åãããããšãã§ããŸãâãããã¯äžçš®ã®æ æ°ãªé
åã§ããããŸãã ç§ã¯[f(x) over x]
ã®ç解æ§æããããã奜ãã§ãããåå¿è
ã«ãšã£ãŠã¯æŠå¿µçã«é£ãããããããŸããïŒåãååãèŠçŽ ãšé
åèªäœã®äž¡æ¹ã«å¹æçã«äœ¿çšãããŠããããïŒã è§ãã£ããªãã®å
å
è¡šèšããžã§ãã¬ãŒã¿ãŒãäœæããå ŽåïŒç§ããã£ãšåã«éãã ããã«ïŒãè§ãã£ããªãã®ãããã®æ°ããover-x-style-å
å
è¡šèšã䜿çšããŠã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
ã®éãã®1ã€ã¯ãè€æ°ã®ã€ãã¬ãŒã¿ã®å Žåã«äœãèµ·ãããã§ãã [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
ã®äœ¿çšã¯éåžžã«äžè¬çã§ãããç°¡æœã«ããå¿
èŠãããããã§ãã
ãããç§ã¯æ§æã«ã€ããŠãžã§ãã説åŸããŸããïŒ ;-)
ããã¯ïŒ4470ã®æšªã«ããã®ã§ãä»ã®ãšãã0.4ãããžã§ã¯ãã«è¿œå ããŸãã
è°è«ã®èŠç¹ãç解ããŠããå Žåãäž»ãªåé¡ã¯ã次ã®ãããªãããã³ã°ã®ãããªæ§æãååŸããããšããããšã§ãã
ã€ã³ã©ã€ã³åã䜿çšããŠãããè¡ãããšã¯å¯èœãããããŸããããã€ã³ã©ã€ã³åãæ©èœããããšã確èªããããã«æ¬åœã«æ³šæããŠãã ããã
å¥ã®ã¢ãããŒãã«ã€ããŠã¯ã©ãã§ããïŒæšæž¬ãããããŒã¿åã«å¿ããŠãã¯ãã䜿çšããŸãã ããŒã¿æ§é ãDataArrayã§ãããšæšæž¬ã§ããå Žåã¯ãDataArraysã©ã€ãã©ãªã«ãã£ãŠæäŸãããmap-macroã䜿çšããŸãã 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ïŒ
ä»ã®äººããã®ãããã®3ã€ã®äŸãèŠããšã 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)
ïŒã$ãè¿ã$ïŒ$ 1 $ïŒ 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ïŒãè¶
ããã€ãã¬ãŒã¿ãšããŠããŒã«ã«ã«å°å
¥ãããŠããããšã瀺ããŸãã æ¬è³ªçã«ãããã¯ãããè¡šèšãé¢æ°ã®å€æŽããé
åã®å€æŽããŸãã¯ããããããã®ã€ã³ããã¯ã¹ã«åãæ¿ãããšæããŸãã ããã«ããããžã§ããææããããããã¯ãªãŒãããã1ã€ãç¯çŽã§ããŸãã
[ 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]))) ]
]
ç解æ§æã®æœåšçãªå©ç¹ã®1ã€ã¯ãèŠçŽ ããšã®æäœã®ãã¿ãŒã³ã®ç¯å²ãåºããããšãã§ããããšã§ãã ããšãã°ãããŒãµãŒãx[m, .i]
ã®i
ã䜿çšããã€ã³ããã¯ã¹ä»ããæé»çã«ã¢ãžã¥ãé·ïŒx [m ãïŒ]ïŒã§ããããšãç解ããå Žåã次ã®ããã«èšè¿°ã§ããŸãã
[ f(x[.i]) * g(y[.j]) over i, j=-i ]
x
ã®èŠçŽ ãšy
ã®èŠçŽ ãéã®é åºã§ä¹ç®ããŸããã€ãŸãã x
ã®æåã®èŠçŽ ãšy
ã®æåŸã®èŠçŽ ãªã©ãä¹ç®ããŸãã ãæžãããšãã§ããŸã
[ 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ã¹ã¿ã€ã«ã®ãªãµã€ã¯ã«ã䜿çšããvectorizeã®åŒ·åããŒãžã§ã³ã¯ãéåžžã«äŸ¿å©ã§ãã ã€ãŸããæ倧ã®åŒæ°ã®ãµã€ãºãšäžèŽããªãåŒæ°ã¯ããªãµã€ã¯ã«ã«ãã£ãŠæ¡åŒµãããŸãã ããããã°ããŠãŒã¶ãŒã¯åŒæ°ã®æ°ãªã©ã«é¢ä¿ãªããå¿ èŠãªãã®ãç°¡åã«ãã¯ãã«åã§ããŸãã
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ïŒãããè¡ãããå°ãæŽç·Žãããæ¹æ³ã®1ã€ã¯ãmodã€ã³ããã¯ã¹ã䜿çšããŠç¹å¥ãªã¿ã€ãã®é
åãå®çŸ©ããããšã§ãã ããã¯ã
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
æ§æã䜿çšããŠé¢æ°ãå®çŸ©ããããšã¯å®éã«ã¯å¿
èŠãããŸããããæ©èœããŸãã ããã«ãããç¡åé¢æ°ãžã®ååã®éå®æ°ãã€ã³ãã£ã³ã°ãäœæãããŸãã ãžã¥ãªã¢ã§ã¯ãç·ç§°é¢æ°ã䜿çšããã®ãäžè¬çã§ãããé¢æ°ãžã®ãã€ã³ãã¯èªåçã«äžå®ã§ãã ããããªããšãã²ã©ãããã©ãŒãã³ã¹ãåŸãããŸãã
ããã§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)]
2ã€ã®äž»ãªéãã¯ãåè ã¯ããããæå³ããããã圢ç¶ã®ä¿åã«é¢ããŠããå€ãã®å¶éãããããšã§ãã
over
ã range
ãããã³window
ã«ã¯ãå埩ã®ä¿®é£ŸåãšããŠOLAPã¹ããŒã¹ã«ããã€ãã®å
è¡æè¡ããããŸãããããã¯äžè²«ããŠããããã§ãã
.
æ§æã¯ãã©ã€ã³ãã€ãºãžã®å¿ã³å¯ãã®ããã«èŠããã®ã§ãç§ã¯ç±å¿ã§ã¯ãããŸããã
$ã¯ããããäžè²«æ§ããããiãjãåŒã«å埩ããå€ãã€ã³ã¿ãŒã³ããŸããïŒ
result = [g(f($i), h($j)) over i, j]
åŒã®èªåãã¯ãã«åã®å ŽåãåŒå
ã®ãã¯ãã«ã®1ã€ãtaint
ããŠãåã·ã¹ãã ã«åŒããã¯ãã«ç©ºéã«æã¡äžããããããšã¯ã§ããŸãããïŒ
ç§ã¯æç³»åã®æäœãšåãããã«ããžã¥ãªã¢ã®è¡šçŸåã«ãã£ãŠãã§ã«æžãããšãã§ããŸã
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 ã
ç§ãæ£ããç解ããŠããå Žåã¯ãäžèšã®ã³ã¡ã³ãã«é¢ããJuliaCon2015ã³ã¡ã³ãã®è§£æ±ºçãææ¡ããããšæããŸãã
ã[...]ãããŠãã©ã€ãã©ãªã®äœæè
ã«@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
ããã§ãããŸãïŒ ãã¯ãã«åå¯èœãªé¢æ°ããé¢æ°ãç¶æ¿ããããšããã¯ãã«åå¯èœã«ãªããŸãã
ç§ã¯ããªããæ¢ããŠãããã®ã«æ²¿ã£ãŠãããé¡ã£ãŠããŸãã
ããããã
MA
å€éç¶æ¿ããªãå Žåãé¢æ°ã¯ã©ã®ããã«ããŠ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ãã¯ãã®ãæãããã«å¯Ÿããé©åãªè§£æ±ºçã§ã¯ãªãããã«æãããŸãã
ããããã
MA
@johnmyleswhite ïŒ
ã³ã¡ã³ãã«è¿ä¿¡ãããã®ã§ãããããããŸããã æ確ã«ã§ããŸããïŒ
ç§ãèšãããšãã§ãã1ã€ã®ããšïŒ
ãVectorizableãã«ã€ããŠç¹å¥ãªããšã¯äœããããŸããã ã¢ã€ãã¢ã¯ã誰ã§ãç¬èªã®é¢æ°ãã¯ã©ã¹ããå®çŸ©ã§ãããšããããšã§ãïŒäŸïŒ MyFunctionGroupA<:Function
ïŒã 次ã«ãïŒäžèšã§ç€ºããããã«ïŒç¬èªã®ãåŒã³åºããã·ã°ããã£ãå®çŸ©ããããšã«ããããã®ã¿ã€ãã®é¢æ°ãžã®åŒã³åºãããã£ããã§ããŸãã
ç§ã®ææ¡ã¯ãBaseå
ã§å®çŸ©ãããé¢æ°ã¯ããã¯ãã«åãããã¢ã«ãŽãªãºã ãèªåçã«èªåçæããããã«Base.Vectorizable <: Function
ïŒãŸãã¯åæ§ã®ãã®ïŒã䜿çšããå¿
èŠããããšããããšã§ãã
次ã«ãã¢ãžã¥ãŒã«éçºè ã次ã®ãããªãã¿ãŒã³ã䜿çšããŠç¬èªã®é¢æ°ãå®è£ ããããšããå§ãããŸãã
myfunction(x::MyType, y::MyType) <: Base.Vectorizable
ãã¡ãããããã©ã«ãã§MyType
ãè¿ããªãå Žåã¯ãç¬èªã®ããŒãžã§ã³ã®promote_type(::Type{MyType},::Type{MyType})
ãæäŸããå¿
èŠããããŸãã
ããã©ã«ãã®ãã¯ãã«åã¢ã«ãŽãªãºã ãäžååãªå ŽåããŠãŒã¶ãŒãç¬èªã®éå±€ãå®è£ ããããšã劚ãããã®ã¯äœããããŸããã
MyVectorizable{nargs} <: Function
call(fn::MyVectorizable{2}, x, y) = ...
myfunction(x::MyType, y:MyType) <: MyVectorizable{2}
MA
@ 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_vectorizableãµãã¿ã€ããïŒ1åã ãïŒå®è£ ã§ããŸãã
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ã¿ã€ããæã€ããšã¯ãŸã ããããèŠçã§ãïŒãããŠå°ããšã¬ã¬ã³ãã§ã¯ãããŸããïŒ...ãããå°ãªããšãããã¯ãžã¥ãªã¢ã®åä»ãªç¹°ãè¿ãïŒ1ïŒã®1ã€ãåãé€ãã§ãããïŒæ°ããè¿œå ããã_each_ãç»é²ããå¿ èŠããããŸã@vectorize_XargãåŒã³åºããŠé¢æ°ãå®è¡ããŸãïŒã
ïŒ1ïŒããã¯ãJuliaãé¢æ°ã®ç¶æ¿ããµããŒãããŠããããšãåæãšããŠããŸãïŒäŸïŒ myfunction(...)<: Vectorizable
ïŒ-v0.4.0ã§ã¯è¡šç€ºãããŸããã Julia 0.4.0ã§åäœããããã«ãªã£ã解決çã¯ãåãªãããã¯ã§ã...é¢æ°ãç»é²ããå¿
èŠããããŸã... @ vectorize_XargãåŒã³åºããããã¯ããã«åªããŠããŸã
MA
ç§ã¯ãŸã ãããäžçš®ã®ééã£ãæœè±¡åã ãšæããŸãã ããã¯ãã«åãã§ããããŸãã¯ããã¯ãã«åãããå¿
èŠã®ããé¢æ°ã¯ãç¹å®ã®çš®é¡ã®é¢æ°ã§ã¯ãããŸããã _Every_é¢æ°ãmap
ã«æž¡ãããšãã§ãããã®åäœãæäŸããŸãã
ãšããã§ãç§ã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ã¯ãã§ã«é¢æ°ãèªåãã¯ãã«åããŸã
é¢æ°å
ã§äœ¿çšããã+
æŒç®åããã¯ãã«åãããŠããããããã®ããã«èŠããŸãã
ããããç§ã¯ãã®æ¯ãèããå€ããã®ã¯ããã»ã©é£ãããªãã¯ãã ãšæããŸãã å人çã«ã¯ããã®ãããªå æ¬çãªãã£ãããªãŒã«æ©èœãäœãããšã«ã€ããŠã©ãæããã¯ããããŸããããããã¯ããªããæãã§ããããšã®ããã«æããŸãã
ç§ã¯ããªãã®äºçŽãå ±æããŸãã ãé¢æ°ãåŒã³åºãæ¹æ³ã¯æ¬¡ã®ãšããã§ãããšããå®çŸ©ãè³¢æã«èšå®ããããšã¯ã§ããŸãããåé¢æ°èªäœããåŒã³åºããããšãã«äœããã¹ããã瀺ããŠããããã§ãããããé¢æ°ã§ãã
ç§ã¯èšãã¹ãã§ããïŒ...ãŠãŒã¶ãŒããã®ãããªã³ã¢æ©èœã«ã¢ã¯ã»ã¹ããããã«ãŠãã³ãŒãæåãå ¥åããããšãèŠæ±ããããªãã®ã§ããŠãŒã¶ãŒå®çŸ©ã®éãŠãã³ãŒãäžçœ®æŒç®åã $ã¯å®éã«è¿œå ããããã®ã®1ã€ã ãšæããŸãããããããšãããããŸãã ãããŒãããã¯å®éã«ä»æ¥ã®ãžã¥ãªã¢ã§æ©èœããŸãïŒãé«éãã§ã¯ãªãå Žåã§ã...ãŸã ïŒïŒ
ãžã¥ãªã¢>ïŒ$ïŒ=ããã
ãžã¥ãªã¢> sin $ïŒ0.5 *ïŒabs2 $ïŒxyïŒïŒïŒ
@binarybana âŠ
/ \mapsto
ã©ãã§ããïŒ
julia> x, y = rand(3), rand(3);
julia> ⊠= map # \mapsto<TAB>
map (generic function with 39 methods)
julia> sin ⊠(0.5 * (abs2 ⊠(x-y)))
3-element Array{Float64,1}:
0.271196
0.0927406
0.0632608
ããããŸãïŒ
â€
/ \Mapsto
âŒ
/ \longmapsto
âŸ
/ \Longmapsto
â€
/ \twoheadmapsto
âž
/ \multimap
ïŒäžŠåãããïŒïŒFWIWãå°ãªããšãæåã¯ã \mapsto
ã¯ã©ã ãã®ä»£æ¿æ§æã§ãããšæããŸããããã¯ãæ°åŠã§äžè¬çã«äœ¿çšãããŠãããåºæ¬çã«ïŒASCIIã®å身ã§ã¯->
ïŒãžã¥ãªã¢ã§ã䜿çšãããŠããããã§ãã ã ããã¯ããªãçŽãããããšæããŸãã
æ°åŠãšããã°âŠã¢ãã«çè«ã§ã¯ãæ¬åŒ§ãªãã§é¢æ°ãã¿ãã«ã«é©çšããããšã«ãã£ãŠè¡šçŸããã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
ïŒã æºååãªã©ãå®çŸ©ããããã®äŸ¿å©ãªæ§æã§ãããããã°ã©ãã³ã°èšèªã«ç°¡åã«è»¢éã§ããããã§ã¯ãããŸããïŒ-}
\Mapsto
ã®ãããªä»ã®éžæè¢ã¯ã©ãã§ããã =>
ïŒãã¢ïŒãšæ··åããŸããïŒ ããã§ã¯ãäž¡æ¹ã®èšå·ã䞊ã¹ãŠåºå¥ã§ãããšæããŸãã
->
âŠ
䌌ãŠããã·ã³ãã«ã¯ãããããããŸãããéåžžã«ç°ãªã£ãŠèŠããã·ã³ãã«ãçŽç²ãªASCIIã®ã·ã³ãã«ã ãã䜿çšããå Žåããããã®ã·ã³ãã«ãéåžžã«å€ããªãçç±ã¯äœã§ããããã
ããã¯ããªãçŽãããããšæããŸãã
ããã¥ã¡ã³ããšçµéšãããã解決ãããšæããŸããããªãã¯åæããŸããïŒ
èšå·ã®ãããªç¢å°ã¯ä»ã«ããããããããŸããæ£çŽãªãšãããæ°åŠãªã©ã§äœã«äœ¿ãããŠããã®ãããããŸãããååã«map
ãå«ãŸããŠããã®ã§ãããã ããææ¡ããŸããã ïŒç¬é¡ïŒ
ç§ã®èšãããããšã¯ã ->
ã¯JuliaãâŠ
ãASCIIã§è¡šçŸããããšããããšã ãšæããŸãã ãããã£ãŠã âŠ
ã䜿çšããŠä»ã®äœããæå³ããããšã¯ããå§ãã§ããŸããã èŠèŠçã«åºå¥ã§ããªãããã§ã¯ãããŸãã:-)
ç§ã®çŽæã¯ã確ç«ãããæ°åŠèšå·ã䜿çšããå Žåãå°ãªããšããžã¥ãªã¢ã®äœ¿çšæ³ã確ç«ããã䜿çšæ³ãšã©ã®ããã«ç°ãªãããèããããšæããããããªããšããããšã§ãã ååã«map
ãå«ãŸããã·ã³ãã«ãéžæããã®ã¯çã«ããªã£ãŠããããã§ããããã®å Žåã¯ããããïŒãŸãã¯ç°ãªãã¿ã€ãã®ãããããŸãã¯ãã®ãããªãããã®ã¿ã€ãïŒã®å®çŸ©ãåç
§ããŸãã ããã¯ãå€ããå°ãªãããã¢ã§ã®äœ¿çšæ³ã«ãåœãŠã¯ãŸããŸããããã§ã¯ããã©ã¡ãŒã¿ãŒã®ãããå
ãå®çŸ©ããŠå®å
šãªé¢æ°ãå®çŸ©ããã®ã§ã¯ãªããç¹å®ã®åŒæ°ïŒãã©ã¡ãŒã¿ãŒå€ïŒã®ãããå
ãå®éã«ãªã¹ãããŸããã€ãŸããæ瀺çã«ã®èŠçŽ ã§ããæŠå¿µçã«åæãããé¢æ°ïŒäŸïŒèŸæžïŒã
@ Ismael-VCææ¡ã®åé¡ã¯ã map
ã2ååŒã³åºãå¿
èŠãããããšã§ãããçæ³çãªè§£æ±ºçã¯äžæçãªé
åãå«ãŸãã map((a, b) -> sin(0.5 * abs2(a-b)), x, y)
ã«æžããããšã§ãã ããã«ã âŠ
ã2åç¹°ãè¿ãããšã¯ãèŠèŠçã«ãå
¥åããå Žåã«ãé©ããŠããŸããïŒASCIIã«çžåœãããã®ãããã°ããã§ãããïŒã
RãŠãŒã¶ãŒã¯ãã®ã¢ã€ãã¢ãå«ããããããŸãããã ~
ã®çŸåšã®äžçœ®ãã¯ãã®ç¹æ®ãªã±ãŒã¹ã®è§£æãå»æ¢ããæ¹åã«é²ããšïŒGLMãDataFramesãªã©ã®ããã±ãŒãžã¯æ°åŒDSLã®ãã¯ã解æã«å€æŽããå¿
èŠããããŸããåç
§httpsïŒ/ /github.com/JuliaStats/GLM.jl/issues/116ïŒãããã«ãããäžçœ®asciiãªãã¬ãŒã¿ãŒã®ãŸããªååã解æŸãããŸãã
a ~ b
ã¯ããŒã¹ã§map(a, b)
ãšããŠå®çŸ©ã§ããããããa .~ b
ã¯broadcast(a, b)
ãšããŠå®çŸ©ã§ããŸããïŒ åŸæ¥ã®äžçœ®æŒç®åãšããŠè§£æããå ŽåãJuMPã<=
ããã³==
ã§è¡ãããã«ãRåŒã€ã³ã¿ãŒãã§ã€ã¹ã®ãšãã¥ã¬ãŒã·ã§ã³ã®ãããªãã¯ãDSLã¯ããã¯ãå
ã§æŒç®åã®ç¬èªã®è§£éãèªç±ã«å®è£
ã§ããŸãã ã
ããã¯ããããæãçŸããææ¡ã§ã¯ãããŸãããããããã䜿ãããããš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ã®åé¡ã«ã¯ãããããããŸããããã®å Žåã¯æããã«ååã§ã¯ãããŸããïŒãå
šäœãšããŠããã»ã©ç°ãªãææ¡ã¯ãããŸããïŒããã¯ãåãæŠå¿µã®åãªããã€ããŒãªããªãšãŒã·ã§ã³ã§ã¯ãããŸããïŒã
調æ»ãäžè«èª¿æ»ïŒïŒshocked :)ãè¡ãããšã§ããã®ã¢ã€ãã¢ãæ°ã«å
¥ããªãã£ããã䟡å€ãèŠãããªãã£ãããã人ãããŸããããã®ãããªããšã«ã€ããŠèª°ãã«èš±å¯ãæ±ããå¿
èŠã¯ãªãã®ã§ããšã«ãããããŸãã ç§ãã¡ãã³ãã¥ããã£ããœãŒã·ã£ã«ãããã¯ãŒã¯ãååã«æŽ»çšããŠããªãã®ã¯ã¡ãã£ãšæ²ããããšã§ãããä»ã®ã³ãã¥ããã£ããã®äŸ¡å€ãç解ããŠããªãããšãããã«æ²ããã§ããç§ããã£ãšç°ãªã£ãæ°é®®ãªæèŠãéããããšãã§ãããã©ããèŠãŠã¿ãŸãããããŸãã¯å°ãªããšããã§ãã¯ããŠãã ããå®éšãšããŠããã®ç¹å®ã®åé¡ã®çŸåšã®æèŠã«ã€ããŠå€§å€æ°ãã©ã®ããã«æããŠãããã調ã¹ããããã©ããªãããèŠãŠãã ããã å€åããã¯æ¬åœã«åœ¹ã«ç«ããªããããããŸãããå€åããã§ã¯ãªããããããŸãããæ¬åœã«ç¥ãå¯äžã®æ¹æ³ããããŸãã
</rambling>
@ Ismael-VCïŒæ¬åœã«æ祚ããããã®ãªããæåã«ãããªããã°ãªããªãããšã¯ãããªããèããã質åã泚ææ·±ãæ€èšããããšã§ãã å šå¡ãã¹ã¬ããå šäœãèªã¿ãåå¥ã«è°è«ããããã«çšæãããŠãããªãã·ã§ã³ãèŠçŽããããšãæåŸ ããããšã¯ã§ããŸããã
map(func, x)
ã¯ã map(v -> sin(0.5 * abs2(v)), x)
ã®ãããªãã®ãã«ããŒããŠãããããããã®ã¹ã¬ããã§èª¬æãããŠããŸãã ãããå¥ã®ã¹ã¬ããã«ç§»åããªãã§ãã ãããäžèšã®ãã¹ãŠã®ææ¡ãèŠããã®ãé£ãããªããŸãã
map
ã䜿çšããŠãžã§ããªãã¯é¢æ°ãé©çšãããšããåçŽãªã±ãŒã¹ã®æ§æãè¿œå ããããšã«å察ããŠããŸããããããããå Žåã¯ãããåºãèŠéãåæã«æ€èšããããšããå§ãããŸãã ããã§ãªããã°ããã®åé¡ã¯ããªãåã«ä¿®æ£ãããŠããå¯èœæ§ããããŸãã
@ Ismael-VCäžè«èª¿æ»ãããã§ç§èŠãå©ããå¯èœæ§ã¯äœãã§ãã ç§ãã¡ã¯ãããã€ãã®è§£æ±ºçã®ã©ããæè¯ã®ãã®ã§ããããèŠã€ããããšããŠããã®ã§ã¯ãªããå®éã«ã¯èª°ããŸã èŠã€ããŠããªã解決çãèŠã€ããããšããŠããŸãã ãã®è°è«ã¯ãã§ã«é·ããå€ãã®äººã ãé¢ãã£ãŠããŸãããã以äžè¿œå ããŠã圹ã«ç«ããªããšæããŸãã
@ Ismael-VCããã§çµæ§ã§ããæ°è»œã«æ祚ããŠãã ããã å®éãç§ã¯éå»ã«ããã€ãã®åé¡ã«ã€ããŠèœæžãæ祚ãè¡ããŸããïŒäŸïŒhttpïŒ//doodle.com/poll/s8734pcue8yxv6t4ïŒã ç§ã®çµéšã§ã¯ãåé¡ã®ã¹ã¬ããã§è°è«ãããããåããå°ãªã人ãæ祚ã«æ祚ããŸãã ããã¯ãéåžžã«å ·äœçãªãå€ãã®å Žåè¡šé¢çãª/æ§æäžã®åé¡ã«æå³ããããŸãã ããããããªããã§ããããšã¯æ¢åã®ãªãã·ã§ã³ããéžã¶ããšã ãã§ããå Žåãäžè«èª¿æ»ã¯ã©ã®ããã«æ°é®®ãªã¢ã€ãã¢ãçã¿åºãã®ã§ããããïŒ
ãã¡ããããã®åé¡ã®æ¬åœã®ç®æšã¯ãæé»çã«ãã¯ãã«åãããé¢æ°ãæé€ããããšã§ãã çè«çã«ã¯ã map
ã®æ§æã§ååã§ãããããã®é¢æ°ã¯ãã¹ãŠããã¹ãŠã®å Žåã«map
ãå®è¡ããŠããã ãã ããã§ãã
ç§ã¯ããã«ã€ããŠæ¢åã®æ°åŠè¡šèšæ³ãæ¢ããããšããŸããããæäœã¯éèŠã§ã¯ãªããè¡šèšæ³ã䜿çšã§ããªããšããã³ã¡ã³ãã衚瀺ãããåŸåããããŸãã æ°åŠçãªæèã§ã®ä»»æã®é¢æ°ã®å Žåãç§ã¯ãããã»ãšãã©ä¿¡ããããšãã§ããŸãã ãã ããæãè¿ãã®ã¯ã¢ãããŒã«ç©è¡šèšã§ãããããã€ãã®äžè¬åããããŸãïŒhttpsïŒ //en.wikipedia.org/wiki/Hadamard_product_ ïŒmatricesïŒ#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-complicated-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ã¯ãåæžïŒäŸïŒ SUM
ïŒãšèŠçŽ åäœã®æäœïŒäŸïŒ >
ã LN
ïŒãåºå¥ããããã®æ§æãæäŸããŠããŸããã åŸè
ã¯ãçŸåšã®Juliaãšåãããã«ãåçŽã«èªåçã«ãã¯ãã«åãããŸãã
@JeffBezanson \circ
ã䜿çšããããšã®å©ç¹ã¯ãã€ã³ããã¯ã¹ä»ããã¡ããªãŒãã€ã³ããã¯ã¹ã»ããïŒæšæºã®æ°åŠçãå®è£
ãïŒããã®é¢æ°ãšããŠè§£éããå Žåããããã³ã°ã¯åçŽãªæ§æã§ãããšããããšã§ãã ã€ãŸãã (sin â x)(i)=sin(x(i))
ãã€ãŸãsin(x[i])
ã§ãã
@mdcfrancisãèšåããŠããããã«ããã€ãã®äœ¿çšã¯æ¬è³ªçã«ãå³ã®é åºãã®æ§æã§ãããæ°åŠïŒãŸãã¯ç¹ã«åè«ã®CSã¢ããªã±ãŒã·ã§ã³ïŒã§ã¯ïŒãããã倪ãïŒã»ãã³ãã³ã§è¡ãããããšããããããŸããããã§ã«ãã€ãããããŸããã¡ããããªãã¬ãŒã¿ãŒã
ãããã®åææŒç®åã®ã©ã¡ããåé¡ããªãå Žåã¯ãä»ã®æŒç®åã䜿çšã§ããŸãã ããšãã°ãå°ãªããšãäžéšã®äœæè
ã¯ãæœè±¡çãªç¢å°/å°ã®æ§æã«äœã\cdot
ã䜿çšããŸããããã¯ãæ¬è³ªçã«ãç¢å°ã®äºçŸ€ïŒå€ããå°ãªããïŒã®ãä¹ç®ãã§ããããã§ãã
ãŸããASCIIã¢ããã°ãå¿ èŠãªå ŽåïŒä¹ç®ã瀺ãããã«å®éã«ããªãªãã䜿çšããäœæè ãããŸãã ïŒäœæ²ã«ã䜿ãããŠããã®ãèŠãããšããããããããŸããããæãåºããŸãããïŒ
ãããã£ãŠã sin . x
ãçºçããå¯èœæ§ããããŸãâŠããããããã¯æ··ä¹±ãæããšæããŸãïŒ-}
ããã§ãâŠãã®æåŸã®ã¢ãããžãŒã¯ãæ¬åœã«åæã®ææ¡ã®1ã€ãã€ãŸã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)]
ããã«ãããé
åæ§ç¯ã®æ§æã«å¹²æžããªããããã®æ§æãå°ãªããšã1ã€åæ©ä»ããããŸãã ::
ãŸãã¯table
ã䜿çšãããšãæ¡åŒµæ©èœf[::(A,B)] = [f(a[i], b[j]) for i in 1:n, j in 1:n]
ã¯ãå°ãªããšã2çªç®ã®èå³æ·±ããŠãŒã¹ã±ãŒã¹ã«ã€ãªãããŸãã
èããã質åãæ éã«æ€èšããŠãã ããã
@toivohããããšãããããŸãã ç§ã¯çŸåšãããã€ãã®æ祚/調æ»ãœãããŠã§ã¢ãè©äŸ¡ããŠããŸãã ãŸããç§ã¯å¥œãŸããæ§æã«ã€ããŠã®ã¿ããŒãªã³ã°ããŸããã¹ã¬ããå šäœãèªã¿ãã人ã¯ãããè¡ãã ãã§ãä»ã®èª°ããããè¡ãããšã«èå³ããªããšä»®å®ããªãã§ãã ããã
誰ãå®éã«èŠã€ããŠããªã解決çãèŠã€ãã
@nalimilan誰ãç§ãã¡ã®äžã«ããªããã€ãŸãã ïŒç¬é¡ïŒ
ããªããã§ããããšã¯æ¢åã®ãªãã·ã§ã³ããéžã¶ããšã ãã§ãããšããäžè«èª¿æ»ã¯ã©ã®ããã«æ°é®®ãªã¢ã€ãã¢ãçã¿åºãã®ã§ããããïŒ
åé¡ã®ã¹ã¬ããã§è°è«ãããããåããå°ãªã人ãæ祚ã«æ祚ããŸãã
@JeffBezansonããªãããã§ã«æ祚ãè¡ã£ããšèããŠããããã§ãããããç¶ããŠãã ããïŒ
sinâx
Unicodeãå¿ èŠã§ããããšã«ããåºãç¥ãããŠããªããããããŸã圹ã«ç«ããªãããã§ãã
Unicodeãããããããã®ã§ãããã䜿çšããŸããããã¿ãè£å®ã§ãããã䜿çšããããã®åªããæ¹æ³ããããŸããããã䜿çšããããšã®äœãåé¡ã«ãªã£ãŠããŸããïŒããããªãå Žåã¯ãææžåããŠæè²ããŸããããååšããªãå Žåã¯ãäœãåé¡ã«ãªããŸããããããçºæããŸããïŒ ä»ã®èª°ãããããçºæããŠäœ¿çšããã®ãæ¬åœã«åŸ ã€å¿ èŠããããŸããããããã°ããããå äŸãšããŠãšããããã®åŸã«ãªã£ãŠåããŠãããæ€èšããããšãã§ããŸããïŒ
â
ã«ã¯åäŸãããã®ã§ãåé¡ã¯ãããUnicodeã§ãããšããããšã§ããïŒ ãªãïŒ ããã§ã¯ãåºãç¥ãããŠããªãæ®ãã®Unicodeããã€äœ¿ãå§ããã®ã§ããããã äžåºŠããªãïŒ
ãã®è«çã«ããã°ããžã¥ãªã¢ã¯ãšã«ããåºãç¥ãããŠããŸããããåŠã³ãã人ã¯ããããŸãã ç§ã®éåžžã«è¬èãªæèŠã§ã¯ãããã¯ç§ã«ã¯æå³ããããŸããã
ååã«å
¬å¹³ã§ããç§ã¯â
ã«å®å
šã«å察ããŠããããã§ã¯ãããŸããã ããªãåºæ¬çãªæ©èœã䜿çšããããã«UnicodeãèŠæ±ããããšã¯ãããã«å¯Ÿãã1ã€ã®å°ã«ãããŸããã å®å
šã«æ²ããã«ã¯å¿
ãããååã§ã¯ãããŸããã
ASCIIã®ä»£æ¿ãšããŠ*
ã䜿çš/ãªãŒããŒããŒãããã®ã¯å®å
šã«ã¯ã¬ã€ãžãŒã§ããããïŒ æ°åŠçã«ã¯çã«ããªã£ãŠãããšèšãããããããŸãããããã®æå³ãç解ããã®ã¯é£ãããããããŸããâŠïŒããã§ãã map
æ©èœã«å¶éãããŠããå Žåã¯ã map
ã¯ãã§ã«ASCIIã®ä»£æ¿æ段ã§ãããïŒïŒ
\circ
ã䜿çšããå©ç¹ã¯ãã€ã³ããã¯ã¹ä»ãã®ãã¡ããªãã€ã³ããã¯ã¹ã»ããïŒæšæºã®æ°åŠçãªãå®è£ ãïŒããã®é¢æ°ãšããŠè§£éããå Žåããããã³ã°ã¯åçŽãªæ§æã§ãããšããããšã§ãã
ãããè²·ããã©ããããããŸããã
@haydããã®ã©ã®éšåïŒ ã€ã³ããã¯ã¹ä»ãã®ãã¡ããªãŒïŒããšãã°ãã·ãŒã±ã³ã¹ïŒã¯ãã€ã³ããã¯ã¹ã»ããããã®é¢æ°ãšããŠèŠãããšãã§ããŸããããããšããã®ãããã³ã°ãæ§æã«ãªããŸããïŒ ãããšããããã¯ãã®å Žåã«åœ¹ç«ã€èŠç¹ã§ããïŒ
æåã®2ã€ã®ïŒæ°åŠçãªïŒãã€ã³ãã¯ããªãè°è«ã®äœå°ããªããšæããŸãã ãããããããç§ã¯ããã§ããã䜿çšããããšã匷ã䞻匵ããã€ããã¯ãããŸãã-ããã¯äž»ã«ããããããã¯ã¡ãã£ãšåã£ãŠããŸãïŒãã§ããã åå¿ã
@mlhetland |>ã¯->ã«ããªãè¿ããä»æ¥ã¯æ©èœããŸã-ãŸããé©åã«é¢é£ä»ãããããšãããå©ç¹ãããããŸãã
x = parse( "sin |> cos |> [1,2]" )
:((sin |> cos) |> [1,2])
@mdcfrancisãã¡ããã§ãã ããããããã¯ç§ããã®é ã«æŠèª¬ããæ§æã®è§£éãå€ããŸãã ã€ãŸãã sinâx
ã¯x |> sin
ãšåçã§ãããïŒ
PSïŒã代æ°ãã§å€±ããããããããŸããããåä»ãé
åæ§é ã§é¢æ°ãèš±å¯ããã ãã§ã 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 sin |> x === mapïŒsinã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ã€ã®ãããã«çµåããŠãããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã ãŸãããããã«ã¯ããçš®ã®èªåãããŒããã£ã¹ãæ©èœããããšæ³å®ããŠããããšã«ã泚æããŠãã ããã æåã«[1ã2]ã_ã«çœ®ãæãããšã代ããã«ç¡åé¢æ°ãäœæã§ããŸãã ãã§ãŒã³ã«Rã®magrittrã«ãŒã«ã䜿çšããŠããããšã«æ³šæããŠãã ããïŒãã§ãŒã³ã¹ã¬ããã®ç§ã®æçš¿ãåç §ããŠãã ããïŒã
å€åããã¯DSLã®ããã«èŠãå§ããŠããŸãã
ç§ã¯ãã®åé¡ãé·ãéãã©ããŒããŠããŠãä»ãŸã§ã³ã¡ã³ãããŠããŸããããããã¯ç§èŠã§ã¯æã«è² ããªããªãå§ããŠããŸãã
ç§ã¯ããããã®ã¯ãªãŒã³ãªæ§æã®ã¢ã€ãã¢ã匷ãæ¯æããŸãã ç§ã¯@tkelmanã®~
ã®ææ¡ãæã奜ãã§ããããã¯ããã®ãããªåºæ¬çãªæ©èœã®ããã«ASCIIå
ã«ãšã©ãŸãããã§ãããããŠãç§ã¯sin~x
ããšãŠã奜ãã§ãã ããã«ãããäžèšã§èª¬æããããã«ãéåžžã«æŽç·Žãããã¯ã³ã©ã€ããŒã¹ã¿ã€ã«ã®ãããã³ã°ãå¯èœã«ãªããŸãã sinâx
ã®äœ¿çšãOKã§ãã ãã£ãšè€éãªããšã«ã€ããŠã¯ãé©åãªã«ãŒãã®æ¹ãã¯ããã«æ確ã§ããïŒãããŠéåžžã¯æé«ã®ããã©ãŒãã³ã¹ã§ããïŒãšæãåŸåããããŸãã ç§ã¯ããŸããéæ³ã®ãæŸéã奜ãã§ã¯ãããŸãããããã¯ã³ãŒãã远跡ããã®ãã¯ããã«é£ããããŸãã éåžžãæ瀺çãªã«ãŒãã®æ¹ãæ確ã§ãã
ããã¯ããã®ãããªæ©èœãè¿œå ãã¹ãã§ã¯ãªããšããããšã§ã¯ãããŸããããç¹ã«ïŒ jb/functions
ãã©ã³ãã®ãã¹ãããïŒè¶
é«éã«ãªããããªã®ã§ãæåã«ç°¡æœã§ç°¡æœãªmap
æ§æã䜿çšããŸãããã ã
jb /é¢æ°ã®å¹æã®1ã€ã¯ã broadcast(op, x, y)
ãã op
ã§ãããŒããã£ã¹ããæåã§ç¹æ®åããã«ã¹ã¿ãã€ãºããŒãžã§ã³x .op y
ãšåããããåªããããã©ãŒãã³ã¹ãçºæ®ããããšã§ãã
ãã£ãšè€éãªããšã«ã€ããŠã¯ãé©åãªã«ãŒãã®æ¹ãã¯ããã«æ確ã§ããïŒãããŠéåžžã¯æé«ã®ããã©ãŒãã³ã¹ã§ããïŒãšæãåŸåããããŸãã ç§ã¯ããŸããéæ³ã®ãæŸéã奜ãã§ã¯ãããŸãããããã¯ã³ãŒãã远跡ããã®ãã¯ããã«é£ããããŸãã éåžžãæ瀺çãªã«ãŒãã®æ¹ãæ確ã§ãã
åæããŸããã exp(2 * x.^2)
ã¯å®å
šã«èªã¿ãããã [exp(2 * v^2) for v in x]
ãããåé·ã§ã¯ãããŸããã ããã§ã®IMHOã®èª²é¡ã¯ãåè
ïŒã³ããŒãå²ãåœãŠãæäœãèåããªãïŒã䜿çšãããããšã§ã人ã
ããã©ããããªãããã«ããããšã§ãããã®ãããäœé圢åŒãå»æ¢ã§ããããã«ãååã«çãæ§æãèŠã€ããå¿
èŠããããŸãã
ããå€ãã®èãã é¢æ°ãåŒã³åºããšãã«å®è¡ãããããšãããã€ããããŸãã
åŒæ°ãªãã§ã«ãŒãããïŒãã§ãŒã³ïŒ
é£éããåŒæ°ã ããã«ãŒãããïŒãããïŒ
ãã¹ãŠã®åŒæ°ãã«ãŒãããïŒmapallïŒ
äžèšã®ããããã¯ã次ã®æ¹æ³ã§å€æŽã§ããŸãã
ã«ãŒãããã¢ã€ãã ãããŒã¯ããïŒãïŒ
ã«ãŒãããªãããã«ã¢ã€ãã ãããŒã¯ããïŒ[]ã®è¿œå ã»ããïŒ
çµ±åå¯èœãªã¢ã€ãã ã¯ãæ§æã«é¢ä¿ãªããèªåçã«åŠçãããå¿
èŠããããŸãã
ã«ãŒãã¹ã«ãŒãããŠããåŒæ°ãå°ãªããšã2ã€ããå Žåãã·ã³ã°ã«ãã³æ¬¡å
ã®æ¡åŒµã¯èªåçã«è¡ãããŸãã
æŸéã¯ã次å
ããã£ãå Žåã«ã®ã¿éããçã¿ãŸã
ãã以å€ã®å Žåã¯äžäžèŽã ã ããããªããæŸéããªããšèšããšããããªãã¯äžããããšãæå³ããŸã
åŒæ°ã®ãµã€ãºãäžèŽããªãå Žåã¯ã代ããã«ãšã©ãŒãçºçããŸããïŒ
sin [x ...]ã¯ãsinïŒxïŒãsinãxãªã©ã®åé·æ§ãå®éã«å€±ããŸãã
ãŸããèããç¶ãããšããããsin[x...]
ã¯[f(x...)]
ã®ããŸãç±å¿ã§ãªãããŒãžã§ã³ã§ãã
æ§æ
[exp(2 * (...x)^2)]
ãŸãã¯ã [exp(2 * (x..)^2)]
ã®ãããªãã®ãå©çšå¯èœã§ãããå®éã®æé»ã®é¢æ°é£éãå°å
¥ãããå Žåã¯èªå·±èª¬æããŸãã
@nalimilanã¯ãããããããã¯ç§ãã«ãŒããªãã§å€§äžå€«ã ãšèšã£ãç§ã®ãã¯ã³ã©ã€ããŒãã«ããŽãªãŒã«åœãŠã¯ãŸããŸãã
ç§ãã¡ããã¹ãŠã®é¡ãããªã¹ãããŠããéãç§ã«ãšã£ãŠã¯ããã«éèŠãªã®ã¯ã map
ã®çµæãå²ãåœãŠãã³ããŒãªãã§å²ãåœãŠå¯èœã«ããããšã§ãã ããã¯ãããã©ãŒãã³ã¹ãéèŠãªã³ãŒãã®ã«ãŒããåŒãç¶ã奜ããã1ã€ã®çç±ã§ãããããã軜æžã§ããã°ïŒïŒ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
ç§ã¯ããã«ã€ããŠèãç¶ããé åç解ãã掟çããé åããããã³ã°ããããã®äžè²«ãããžã¥ãªã¢ã³æ§æãã€ãã«ç解ãããšæããŸãã 次ã®ææ¡ã¯ããã§ã«ç¢ºç«ãããŠããé åç解èšèªã«åºã¥ããŠããããããžã¥ãªã¢ã³ã§ãã
f[a...]
ããå§ãŸããã³ã³ãã³ã·ã§ã³f[a...] == map(f, a[:])
f[a..., b...] == map(f, a[:], b[:])
etc
ããã¯æ°ããã·ã³ãã«ãå°å ¥ããŸããã
2.ïŒããã«å ããŠã1ã€ã®è¿œå æŒç®åã®å°å
¥ãææ¡ããŸãã_shapepreserving_splattingæŒç®å..
ïŒããšãã°ïŒã ããã¯ã ...
ã_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
æ§æã®å©ç¹ã®1ã€ã¯ãåŒãã©ã®ããã«åŠçãããã§ãã
sin(x * (y - 2)) over x, y == map((x, y) -> sin(x * (y - 2)), x, y)
ãããèš±å¯ãããå Žåã¯ãäžèšã®[sin(x.. * y..)]
ãŸãã¯sin[x.. * y..]
ãçµç±ããå¯èœæ§ããããŸãã é¢æ°ãã³ã³ãããŒã§ã¯ãªãèŠçŽ ãæäœãããšããèŠèŠçãªãã³ããäžããã®ã§ããªãŒããŒæ§æãããå°ãæ°ã«å
¥ã£ãŠããŸãã
ãããã 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
ã®ããã
ãã1ã€ã®å¯èœæ§ã¯ã 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^2)-x over x
f.(x)
ã䜿çšããããšã§ããããè€éãªåŒã®å Žåf(x^2)-x over x
ã
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
ãåãé€ãããšãã§ããŸãã ãã®åŸã over
ïŒãŸãã¯ãã®ä»ïŒã®ãããªæ§æã§äœæ¥ãç¶ããŠã map
ãšå
å
è¡šèšã®ããäžè¬çãªäœ¿çšæ³ãçç¥ã§ããŸãã
@stevengj -
ã¯ãããŒããã£ã¹ããããªãããã2çªç®ã®äŸã¯æ©èœããªããšæããŸãã A
ãè¡åã§ãããšãããšãåºåã¯åäžè¡ã®è¡åã®è¡åã«ãªããŸããåè¡ã¯ã A
ã®èŠçŽ ã®å¯Ÿæ°ãã1次å
ã«æ²¿ã£ãåèšã®ãã¯ãã«ãåŒãããã®ã§ãã broadcast((x, y)->exp(log(x)-y), A, sum(A, 1))
ãå¿
èŠã§ãã ãããã map
ã®ç°¡æœãªæ§æã¯äŸ¿å©ã§ãããå¿
ãããbroadcast
ã®ç°¡æœãªæ§æã§ããå¿
èŠã¯ãªããšæããŸãã
sin
ã®ããã«æŽå²çã«èªåãã¯ãã«åãããŠããé¢æ°ã¯ãæ°ããæ§æã§ãåŒãç¶ããããªãã®ã§ããããããããšãéæšå¥šã«ãªãã®ã§ããããã f.
æ§æã§ãããæŠå¿µçãªãšã¬ã¬ã³ã¹ã®è°è«ã«åæ©ä»ããããŠããªãç§åŠããã°ã©ããŒã®å€§éšåã«ãšã£ãŠã¯ãèœãšãç©Žãã®ããã«æããã®ã§ã¯ãªãããšå¿é
ããŠããŸãã
ç§ã®èãã§ã¯ã sin
ã®ãããªæŽå²çã«ãã¯ãã«åãããé¢æ°ã¯ã sin.
ãåªå
ããŠéæšå¥šã«ããå¿
èŠããããŸãããïŒåŸç¶ã®ãªãªãŒã¹ã§å®å
šã«åé€ãããã®ã§ã¯ãªãïŒæºæ°žç¶çã«éæšå¥šã«ããå¿
èŠããããŸããä»ã®ç§åŠèšèªããã®ãŠãŒã¶ãŒã®å©çã
f.(args...)
ã«é¢ãã1ã€ã®ãã€ããŒãªïŒïŒïŒåé¡ïŒ object.(field)
æ§æã¯ã»ãšãã©ã®å Žåã»ãšãã©äœ¿çšããããããŸãèŠåŽããã«getfield(object, field)
ã«çœ®ãæããããšãã§ããŸããã Base.(:+)(....) = ....
ã®åœ¢åŒã®ã¡ãœããå®çŸ©/åç
§ã®_lot_ã§ãããããããgetfield
ã«å€æŽããã®ã¯é¢åã§ãã
1ã€ã®åé¿çã¯æ¬¡ã®ãšããã§ãã
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)
ãæžãããšã«è³æããŠè¯ãè°è«ããããšæããŸãã ã§ãããããã¹ã¯ã¯ãªã¢ããããšæããŸãã
ãã®æ§æãè€ååŒã«å¹ççã«äžè¬åãããœãªã¥ãŒã·ã§ã³ããŸã ãªããšããäºå®ã«ã€ããŠãç§ã¯1ã€ã®äºçŽãããŸããã ãããããã®æ®µéã§ã¯ããã®è°è«ãç¡æéã«è§£æ±ºããªãããããã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒãããã®æ©èœãããŒãžããã»ãããããšæããŸãã
@JeffBezansonããªã¢ãŒãžã®è°è«äžã«ãããæã¡åºãããã«ãããã®ãã€ã«ã¹ããŒã³ã0.5.0ã«æ»ããŠããŸããäž»ã«ãå¿ããªãããã«ããããã§ãã
ïŒ15032ã¯call
ã§ãæ©èœããŸããïŒäŸïŒ Int32.(x)
ïŒ
@ViralBShah ãã¯ãã f.(x...)
ã¯ã f
ã®ã¿ã€ãã«é¢ä¿ãªããæ§æã¬ãã«ã§map(f, broadcast, x...)
ã«å€æãããŸãã
ãããã f[x...]
ã®ãããªãã®ã«å¯Ÿãã.
ã®äž»ãªå©ç¹ã§ããããã¯ãä»ã®ç¹ã§ã¯é
åçã§ããïŒããŒãµãŒã®å€æŽã¯å¿
èŠãããŸããïŒã f::Function
ã§ã®ã¿æ©èœããŸãã f[x...]
ããæŠå¿µçã«ã¯T[...]
é
åå
å
è¡šèšãšå°ãè¡çªããŸãã @StefanKarpinskiã¯è§ãã£ãæ§æã奜ãã ãšæããŸããïŒ
ïŒå¥ã®äŸãéžæãããšãPyCallã®o::PyObject
ãªããžã§ã¯ãã¯åŒã³åºãå¯èœã§ãããPythonãªããžã§ã¯ão
ã®__call__
ã¡ãœãããåŒã³åºããŸãããåããªããžã§ã¯ãão[...]
ããµããŒãããå ŽåããããŸãã f[x...]
ãããŒããã£ã¹ããšã¯å°ãè¡çªããŸããã o.(x...)
ãããŒããã£ã¹ãã§ã¯æ£åžžã«æ©èœããŸããïŒ
call
ã¯ããååšããŸããã
ïŒ f.(x...)
ã.(
ã.+
ãªã©ã®é¡äŒŒç©ã«ãããšãã@nalimilanã®è°è«ã奜ãã§ãïŒ
ã¯ãããã€ã³ãã¯ã€ãºã®ã¢ãããžãŒã¯ç§ãäžçªå¥œããªãã®ã§ãã å ã«é²ãã§ããŒãžã§ããŸããïŒ
ã¢ãžã¥ãŒã«ãå«ãgetfieldã¯ãå®éã®éæšå¥šã«ããå¿ èŠããããŸããïŒ
@tkelman ãäœãšã¯å¯Ÿç
§çã«ïŒ ãã ãã Base.(:+)
ïŒã€ãŸãããªãã©ã«ã·ã³ãã«åŒæ°ïŒã®éæšå¥šèŠåã¯ã getfield
Base.:+
ãææ¡ããå¿
èŠããããŸãã ïŒ_Update_ïŒã¡ãœããå®çŸ©ãåŠçããããã«æ§æã®éæšå¥šãå¿
èŠã§ãããïŒ
@ViralBShah ãæšææ¥ã®ããªã¢ãŒãžãã£ã¹ã«ãã·ã§ã³ã§ããã«ã€ããŠäœã決å®ã¯ãããŸãããïŒ ïŒ15032ã¯ããŒãžã«ããªãè¯ã圢ã ãšæããŸãã
Viralã¯é»è©±ã®ãã®éšåãéãããšæããŸãã ç§ã®å°è±¡ã§ã¯ãè€æ°ã®äººããŸã f.(x)
ã®çŸåŠã«ã€ããŠäºçŽãæã£ãŠãããã©ã¡ããã奜ããããããŸãã
~
ã®ãã¯ã解æãéæšå¥šã«ãããšããç§ã®ä»¥åã®ã¢ã€ãã¢ã¯ãããã±ãŒãžã§çœ®ãæããäœæ¥ãå¿
èŠã§ããããã®ãµã€ã¯ã«ã§ãããè©Šã¿ãã«ã¯ããããé
ãããŸããã¯ããäºçŽã¯ãããŸãããçŸåšf.(x)
ãããè¯ããªãã·ã§ã³ã¯ãããŸããã ~
ã®ãããªä»»æã®èšå·ãéžæãããããè¯ãããã§ãããŸãã .*
ïŒãªã©ïŒã«æ
£ããŠããå€ãã®äººã¯ããããäœãæå³ããã®ãããã«æšæž¬ã§ããã§ãããã
ç§ãããããç解ãããããšã®1ã€ã¯ã人ã
ãæ¢åã®ãã¯ãã«åãããå®çŸ©ã.(
ã§_眮æ_ããŠã倧äžå€«ãã©ããã§ãã 亀æãããã®ã«ååãªäººãæ°ã«å
¥ããªããã°ãç§ã¯ãã£ãšèºèºããŸãã
ãã®è°è«ã«æœãã§ãããŠãŒã¶ãŒãšããŠãç§ã¯ããã䜿ã£ãŠæ¢åã®ãã¯ãã«åãããã³ãŒãã眮ãæããããšæã£ãŠããŸãã
ã«ãŒããéãã®ã§ãèªã¿ãããã®ããã«ç§ã¯äž»ã«juliaã§ãã¯ãã«åã䜿çšããŸãã ã§ããããåè¿°ã®ããã«expãsinãªã©ã«ãã䜿ãã®ã奜ãã§ãã ç§ã¯ãã§ã«ã^ãã*ããã®ãããªåŒã§äœ¿çšããŠããã®ã§ãsinã«äœåãªããããè¿œå ããŸãã expã etcã¯ãç§ã«ãšã£ãŠæ¬åœã«èªç¶ã§ãããã«æ確ã«æããŸã...ç¹ã«ãsinïŒxïŒãšmapïŒfãxïŒãæ··åãã代ããã«ãäžè¬çãªè¡šèšæ³ã䜿çšããŠèªåã®é¢æ°ã§ç°¡åã«æããããããšãã§ããå Žåã¯ç¹ã«ããã§ãã
èšããŸã§ããªããç§ã¯éåžžã®ãŠãŒã¶ãŒãšããŠããããããŒãžãããããšãæ¬åœã«æãã§ããŸãïŒ
fun.(vec)
ãããææ¡ãããfun[vec]
æ§æã®æ¹ã奜ãã§ãã
[fun vec]
ã«ã€ããŠã©ãæããŸããïŒ ããã¯ãªã¹ãå
å
è¡šèšã«äŒŒãŠããŸãããæé»ã®å€æ°ããããŸãã T[fun vec]
ãå®è¡ã§ããå¯èœæ§ããããŸã
ãã®æ§æã¯ãJulia 0.4ã§ã¯ãé·ãã1ãã倧ãããã¯ãã«ã«å¯ŸããŠã¯ç¡æã§ãã
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ïŒã§ã®åèšç®ã®åé¡ã解決ãããããå¥ã®PRãäœæããŠãä»»æã®æŒç®åâ§
ã®a .⧠b
$ïŒ$ãåãªãç ç³ã«ãªãããã«ããããšãæãã§ããŸãã 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 ãïŒ15032ã§ã³ã¡ã³ãããããã«ãé¢æ°ã@pure
ãšããŠããŒã¯ãããŠããå ŽåïŒå°ãªããšãeltypeãäžå€ã®å ŽåïŒãã«ãŒãèåã¯å¯èœã§ããããã«èŠããŸãããããã¯ã³ã³ãã€ã©ã®ã¿ã¹ã¯ã§ãããããŒãµãŒã ïŒãã ãããã®ãããªãã¯ãã«åãããæ§æã¯ãéèŠãªå
éšã«ãŒãããæåŸã®ãµã€ã¯ã«ãçµãåºãããã䟿å©ã§ããïŒ
ããã§ã®äž»ãªç®æšã¯ã @vectorized
é¢æ°ã®å¿
èŠæ§ãæé€ããããšã§ããããšãå¿ããªãã§ãã ããã ããã«ã¯ãå°ãªããšãåããããäžè¬çã§ãã»ãŒåãããã䟿å©ã§ãå°ãªããšãåããããéãæ§æãå¿
èŠã§ãã èªåã«ãŒãèåã¯å¿
èŠãããŸããããå°æ¥ã®ã«ãŒãèåã®å¯èœæ§ãéãããã«ããŠãŒã¶ãŒã®broadcast
ã®æå³ãã³ã³ãã€ã©ãŒã«å
¬éããã®ã¯è¯ãããšã§ãã
ã«ãŒãèåãè¡ãå Žåãäœãæ¬ ç¹ã¯ãããŸããïŒ
@yuyichao ãã«ãŒãèåã¯ã¯ããã«é£ããåé¡ã§ãããçŽç²ã§ãªãé¢æ°ãèã«çœ®ããŠãåžžã«å¯èœã§ãããšã¯éããŸããïŒããšãã°ãäžèšã®@StefanKarpinskiã®exp(log(A) .- sum(A,1))
ã®äŸãåç
§ããŠãã ããïŒã ç§ã®æèŠã§ã¯ããããå®è£
ãããã®ãåŸ
ã€ãšãããããå®è£
ãããªãããšã«ãªããŸãâããã¯æ®µéçã«å®è¡ããå¿
èŠããããŸãã ãŠãŒã¶ãŒã®æå³ãæããã«ããããšããå§ããŸãã å°æ¥ããã«æé©åã§ããã°ããã°ãããã§ãã ããã§ãªãå Žåã§ããçŸåšå©çšå¯èœãªå°æ°ã®ããã¯ãã«åããããé¢æ°ã®äžè¬åããã代æ¿åããããŸãã
ãã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ãããŒããã£ã¹ãæ§æ_ïŒç§ã¯ãŸããŸã奜ãã§ãïŒã®ææ¡ã§ã¯ãèåã¯ã 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ïŒãã®è°è«ã«ã¯ãå®éã«ã¯éåžžã«çŽäº€ããŠãã2ã€ã®æŠå¿µããããŸãã
matlab'yã®ãèåãããŒããã£ã¹ãæäœããŸãã¯x .* y .+ z
ãšapl'yã®ã補åãšzipã®ããããïŒ f[product(I,J)...]
ãf[zip(I,J)...]
ãªã©ïŒã ãäºããè¶
ããŠè©±ãããšããããšé¢ä¿ããããããããŸããã
@mschauer ã$ïŒ I
ãšJ
ãåã圢ç¶ã®å Žåã f.(I, J)
ã¯ãã§ã«ïŒïŒ15032ã§ïŒ map(x -> f(x...), zip(I, J)
ãšåçã§ãã ãŸãã I
ãè¡ãã¯ãã«ã§ã J
ãåãã¯ãã«ã§ããå ŽåããŸãã¯ãã®éã®å Žåã broadcast
å®éã«è£œåã»ããã«ããããããŸãïŒãŸãã¯f.(I, J')
ãå®è¡ã§ããŸãïŒãäž¡æ¹ã1dé
åã®å Žåã¯
çŽäº€ã¯æ£ããèšèã§ã¯ãããŸããã§ããããããã¯å ±åããã®ã«ååã«ç°ãªã£ãŠããŸãã
ãã ããéèŠãªã®ã¯ã2ã€ã®ã±ãŒã¹ã«å¥ã
ã®æ§æã¯å¿
èŠãªããšããããšã§ãã func.(args...)
ã¯äž¡æ¹ããµããŒãã§ããŸãã
äžé æ¿æ²»ã®ã¡ã³ããŒïŒStefanãJeffãViralïŒãïŒ15032ïŒããŒãžå¯Ÿå¿ã ãšæããŸãïŒãããŒãžãããããããéããŠããŒããããã®åé¡ãæåºããæ®ãã®ææ¡ãããå€æŽã®æŠèŠã瀺ããŸãïŒãããŒããã£ã¹ãã¿ã€ãã®ä¿®æ£-èšç®ãéæšå¥š@vectorize
ã .op
ããããŒããã£ã¹ãã·ã¥ã¬ãŒã«å€æããæ§æã¬ãã«ã®ãbroadcast-fusionããè¿œå ããŠãæåŸã«ã€ã³ãã¬ãŒã¹å²ãåœãŠãšèåããŸãã æåŸã®2ã€ã¯ãããã0.5ã«ã¯ãªããŸããã
ãããç§ã¯15032ã«ã€ããŠéåžžã«å¹žãã§ãããæè¬ããŠããŸããããããç§ã¯è°è«ãåŠå®ããã€ããã¯ãããŸããã ããšãã°ããã¯ãã«ã®ãã¯ãã«ãåæ§ã®ãªããžã§ã¯ãã¯ããžã¥ãªã¢ã§äœ¿çšããã®ã¯ãŸã éåžžã«åä»ã§ãããç解ã®çµæãšããŠéèã®ããã«çºèœããå¯èœæ§ããããŸãã ã·ã³ã°ã«ãã³æ¬¡å ãžã®å埩ã®ãšã³ã³ãŒãã«åºã¥ããªãåªããæé»ã®è¡šèšæ³ã¯ãããšãã°ãæè»ãªã€ãã¬ãŒã¿ãŒãæ°ãããžã§ãã¬ãŒã¿ãŒåŒã䜿çšããããšã§ããããå€§å¹ ã«ç·©åããå¯èœæ§ããããŸãã
ïŒ16285ãæ¯æããŠããããéããããšãã§ãããšæããŸãã
æãåèã«ãªãã³ã¡ã³ã
äžé æ¿æ²»ã®ã¡ã³ããŒïŒStefanãJeffãViralïŒãïŒ15032ïŒããŒãžå¯Ÿå¿ã ãšæããŸãïŒãããŒãžãããããããéããŠããŒããããã®åé¡ãæåºããæ®ãã®ææ¡ãããå€æŽã®æŠèŠã瀺ããŸãïŒãããŒããã£ã¹ãã¿ã€ãã®ä¿®æ£-èšç®ãéæšå¥š
@vectorize
ã.op
ããããŒããã£ã¹ãã·ã¥ã¬ãŒã«å€æããæ§æã¬ãã«ã®ãbroadcast-fusionããè¿œå ããŠãæåŸã«ã€ã³ãã¬ãŒã¹å²ãåœãŠãšèåããŸãã æåŸã®2ã€ã¯ãããã0.5ã«ã¯ãªããŸããã