Julia: `mapfunc、x`の代替構文

䜜成日 2014幎09月23日  Â·  283コメント  Â·  ゜ヌス: JuliaLang/julia

これに぀いおは、ここで詳しく説明したした。 私はそれを芋぀けるのに苊劎しおいたした、そしおそれはそれ自身の問題に倀するず思いたした。

breaking speculative

最も参考になるコメント

䞉頭政治のメンバヌStefan、Jeff、Viralが15032マヌゞ察応だず思いたすをマヌゞしたら、これを閉じおロヌドマップの問題を提出し、残りの提案された倉曎の抂芁を瀺したすブロヌドキャストタむプの修正-蚈算、非掚奚@vectorize 、 .opをブロヌドキャストシュガヌに倉換し、構文レベルの「broadcast-fusion」を远加しお、最埌にむンプレヌス割り圓おず融合したす。 最埌の2぀はおそらく0.5にはなりたせん。

党おのコメント283件

+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を䜿甚したす。

玔粋な絶望からのいく぀かの他のアむデア

  1. コロンをオヌバヌロヌド、 sin:x 。 耇数の匕数にうたく䞀般化されおいたせん。
  2. sin.[x] ---この構文は䜿甚可胜ですが、珟圚は意味がありたせん。
  3. 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を䜿甚したす。

䞀般的に䜿甚されるベクトル化された数孊関数を削陀するずどうなるか想像しおみたしょう。

  1. 個人的には、 exp(x) map(exp, x)を曞いおもかたいたせんが、埌者は少し短くおきれいです。 ただし、パフォヌマンスには_倧きな_違いがありたす。 ベクトル化された関数は、私のマシンのマップよりも玄5倍高速です。
  2. 耇合匏を䜿甚しおいる堎合、問題はさらに興味深いものになりたす。 耇合匏を考えおみたしょう exp(0.5 * abs2(x - y)) 、そしお次のようになりたす
# baseline: the shortest way
exp(0.5 * abs2(x - y))    # ... takes 0.03762 sec (for 10^6 elements)

# using map (very cumbersome for compound expressions)
map(exp, 0.5 * map(abs2, x - y))   # ... takes 0.1304 sec (about 3.5x slower)

# using anonymous function (shorter for compound expressions)
map((u, v) -> 0.5 * exp(abs2(u - v)), x, y)   # ... takes 0.2228 sec (even slower, about 6x baseline)

# using array comprehension (we have to deal with two array arguments)

# method 1:  using zip to combine the arguments (readability not bad)
[0.5 * exp(abs2(u - v)) for (u, v) in zip(x, y)]  # ... takes 0.140 sec, comparable to using map

# method 2:  using index, resulting in a slightly longer statement
[0.5 * exp(abs2(x[i] - y[i])) for i = 1:length(x)]  # ... takes 0.016 sec, 2x faster than baseline 

ベクトル化された数孊関数を削陀する堎合、読みやすさずパフォヌマンスの䞡方で受け入れられる唯䞀の方法は、配列の理解であるように思われたす。 それでも、それらはベクトル化された数孊ほど䟿利ではありたせん。

-ベクトル化されたバヌゞョンを削陀する堎合は-1。 実際、VMLやYepppなどのラむブラリは、ベクトル化されたバヌゞョンに察しおはるかに高いパフォヌマンスを提䟛するため、これらを掻甚する方法を理解する必芁がありたす。

これらがベヌスにあるかどうかは別の議論であり、より倧きな議論ですが、ニヌズは珟実的であり、パフォヌマンスは私たちが持っおいるものよりも高くなる可胜性がありたす。

@lindahuaず@ViralBShah  mapを改善する前に、ベクトル化された関数を削陀するこずを前提ずしおいるようですが、誰かがそうするこずを提案しおいるずは思いたせん。

@lindahuaの䟋は非垞にわかりやすいず思いたす。ベクトル化された構文は、他の゜リュヌションよりもはるかに優れおおり、数匏に非垞に近いものです。 私はそれを倱うのはかなり悪いこずであり、他の科孊蚀語から来た人々はおそらくこれをゞュリアの吊定的な点ず芋なすでしょう。

すべおのベクトル化された関数を削陀しおも問題ありたせん 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、他の構文提案は既存の構文に芖芚的に近すぎるため、コヌドを調べるずきに解析するにはさらに粟神的な努力が必芁になりたす。

  • foo。x-暙準タむプのメンバヌアクセスず芖芚的に類䌌
  • foo [x] -foo配列のx番目のメンバヌにアクセスしおいたすか、それずもここでマップを呌び出しおいたすか
  • .foox- @ kmsquireが指摘したように問題がありたす

そしお、 @vec゜リュヌションは、そもそも避けようずしおいる@vectorizeに近すぎるように感じたす。 確かに、8297の泚釈はいく぀かあるず䟿利であり、将来的に圹立぀可胜性がありたす。よりスマヌトなコンパむラヌは、これらのストリヌム融合の機䌚を認識し、それに応じお最適化できたす。 しかし、私はそれを匷制するずいう考えは奜きではありたせん。

䞭眮マップず高速無名関数も、次のようなこずができる堎合、䞀時的なものの䜜成に圹立ちたす。

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

クヌルな新しいTrait.jlのアむデアは、ベクトル化可胜な関数を指定するずいう文脈で借りるこずができるのだろうか。 もちろん、この堎合、特定の特性を持぀juliaタむプではなく、 Functionタむプの個々の_むンスタンス_がベクトル化可胜かどうかを確認しおいたす。

さお、ナヌザヌ定矩の䞭眮挔算子に察するHaskellのようなサポヌトしかなかったずしたら

65826929十分ではありたせんか

この議論には、可胜な限り少ない配列䞀時で匏党䜓をベクトル化するこずに぀いおのポむントがありたす。 ベクトル化された構文が必芁なナヌザヌは、ベクトル化されたexp(x)だけは必芁ありたせん。 圌らは次のような衚珟を曞きたいず思うでしょう

y =  √π exp(-x^2) * sin(k*x) + im * log(x-1)

魔法のようにベクトル化しおもらいたす

関数を「ベクトル化可胜」ずしおマヌクする必芁はありたせん。 これはむしろ、関数がどのように実装され、Juliaが利甚できるかずいう特性です。 たずえばCで実装されおいる堎合は、LLVMオプティマむザが匕き続きアクセスできるように、オブゞェクトファむルではなくLLVMバむトコヌドにコンパむルする必芁がありたす。 Juliaでそれらを実装するこずも機胜したす。

ベクトル化可胜性ずは、Yepppプロゞェクトで非垞によく説明されおいる方法で関数を実装するこずを意味したす。ハヌドりェアでベクトル呜什ずしお䜿甚できる堎合は、分岐、テヌブル、陀算、たたは平方根はありたせん。マヌゞ操䜜。

残念ながら、そのような実装はハヌドりェアに䟝存したす。぀たり、どのハヌドりェア呜什が効率的であるかに応じお、異なるアルゎリズムたたは異なる実装を遞択する必芁がある堎合がありたす。 私は過去にこれをC ++でhttps://bitbucket.org/eschnett/vecmathlib/wiki/Home、わずかに異なるタヌゲットオヌディ゚ンス自動ベクトル化ではなく手動でベクトル化されるステンシルベヌスの操䜜で実行したした。コンパむラ。

ここJuliaでは、aコンパむラヌがLLVMであるこずがわかっおおり、bC ++の代わりにJuliaでこれを実装できるためマクロずテンプレヌト、䜜業が簡単になりたす。

もう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)

それなら

  1. Xからリフトの゜ヌスドメむンずタヌゲットドメむンを特定したす。タむプMatrix{Float64}で、芁玠タむプパラメヌタヌ Float64ですしたがっお、暗黙的にFloat64 => Matrix{Float64}リフトを定矩したす 、 それから
  2. matrixfunc(x->exp(c*x^2)*sin(x), X)を呌び出しお、 expm(c*X^2)*sinm(X)に盞圓するものを蚈算したすが、行列の乗算は避けたす。

他のコヌドでは、 XはVector{Int}であり、暗黙のリフティングはIntからVector{Int}になり、 lift(x->exp(c*x^2)*sin(x), X)は$$ 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などのさたざたなデヌタ型で機胜したす。
  • 手動で蚘述されたルヌプず同じくらい高速です。

むンラむン化を䜿甚しおそれを行うこずは可胜かもしれたせんが、むンラむン化が機胜するこずを確認するために本圓に泚意しおください。

別のアプロヌチに぀いおはどうですか掚枬されたデヌタ型に応じおマクロを䜿甚したす。 デヌタ構造が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

もありたす

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あなたがすでに投祚を行ったず聞いおうれしいです、それを続けおください

  • 䞖論調査をどのように宣䌝しおきたしたか
  • 私がこれたでに評䟡した䞖論調査/調査゜フトりェアから、kwiksurveys.comは、ナヌザヌが_このオプションのどれも私のためではない_オプションの代わりに自分の意芋を远加できるようにしたす。

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

私はそれに぀いお考え続け、配列理解から掟生した配列をマッピングするための䞀貫したゞュリアン構文を぀いに理解したず思いたす。 次の提案は、すでに確立されおいる配列理解蚀語に基づいおいるため、ゞュリアンです。

  1. @Juthoによっお実際に提案されたf[a...]から始たり、コンベンション
    ベクトルa、bの堎合
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)の矎孊に぀いお予玄を持っおおり、どちらかを奜むかもしれたせん

  1. 抂念的にも実装䞊も単玔な䞭眮挔算子ですが、私が芋るこずができるものから利甚できるASCII挔算子はありたせん。 ~のマクロ解析を非掚奚にするずいう私の以前のアむデアは、パッケヌゞで眮き換える䜜業が必芁であり、このサむクルでそれを詊みるにはおそらく遅すぎたす。
  2. たたは、ルヌプの融合ず䞀時的なものの排陀を容易にする代替の新しい構文。 15032のレベルに近い堎所には他の代替手段が実装されおいないため、予玄が残っおいるにもかかわらず、それをマヌゞしお詊しおみる必芁があるようです。

はい、予玄はありたすが、珟圚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を支持しお、これを閉じるこずができるず思いたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡