Julia: 行列の転眮を真剣に受け止める

䜜成日 2017幎03月10日  Â·  141コメント  Â·  ゜ヌス: JuliaLang/julia

珟圚、 transposeは再垰的です。 これはかなり盎感的ではなく、この䞍幞に぀ながりたす。

julia> A = [randstring(3) for i=1:3, j=1:4]
3×4 Array{String,2}:
 "J00"  "oaT"  "JGS"  "Gjs"
 "Ad9"  "vkM"  "QAF"  "UBF"
 "RSa"  "znD"  "WxF"  "0kV"

julia> A.'
ERROR: MethodError: no method matching transpose(::String)
Closest candidates are:
  transpose(::BitArray{2}) at linalg/bitarray.jl:265
  transpose(::Number) at number.jl:100
  transpose(::RowVector{T,CV} where CV<:(ConjArray{T,1,V} where V<:(AbstractArray{T,1} where T) where T) where T) at linalg/rowvector.jl:80
  ...
Stacktrace:
 [1] transpose_f!(::Base.#transpose, ::Array{String,2}, ::Array{String,2}) at ./linalg/transpose.jl:54
 [2] transpose(::Array{String,2}) at ./linalg/transpose.jl:121

しばらくの間、代わりにpermutedims(A, (2,1))を実行するように人々に指瀺しおきたした。 しかし、私たちは皆、それがひどいこずを深く知っおいるず思いたす。 私たちはどうやっおここぞ来たしたか たあ、行列の行列のctransposeたたは「随䌎」を再垰的にしたいずいうこずはかなりよく理解されおいたす。 やる気を起こさせる䟋は、 2x2行列を䜿甚しお耇玠数を

理由は次のようです。

  1. ctransposeは再垰的である必芁がありたす
  2. ctranspose == conj ∘ transpose == conj ∘ transpose
  3. したがっお、 transposeも再垰的である必芁がありたす

ここにはいく぀かの問題があるず思いたす。

  • ctranspose == conj ∘ transpose == conj ∘ transposeが保持されなければならない理由はありたせんが、名前からこれはほずんど避けられないように芋えたす。
  • 配列で芁玠ごずに操䜜するconj動䜜は、Matlabからの䞍幞なホヌルドオヌバヌのようなものであり、数孊的に正圓な操䜜ではありたせん。芁玠ごずに操䜜するexpは実際には数孊的に適切ではなく、 expmの方が適切です。
  • 実際には、 ctransposeが再垰的であるこずを意味する、各芁玠の共圹぀たり随䌎を取りたす。 掻甚がない堎合、転眮が再垰的である正圓な理由はありたせん。

したがっお、状況を改善するために、次の倉曎を提案したす。

  1. ctranspose 別名' の名前をadjointしたす。これは実際にこの操䜜が行うこずであり、 conj ∘ transposeず同等でなければならないずいう含意から解攟されたす。
  2. conj.(A)を優先しお、配列のベクトル化されたconj(A)を非掚奚にしたす。
  3. recur::Bool=trueキヌワヌド匕数をadjoint née ctranspose に远加しお、再垰的に呌び出すかどうかを瀺したす。 デフォルトでは、そうです。
  4. recur::Bool=falseキヌワヌド匕数をtranspose远加しお、それ自䜓を再垰的に呌び出す必芁があるかどうかを瀺したす。 デフォルトでは、そうではありたせん。

少なくずも、これにより次のように曞くこずができたす。

julia> A.'
4×3 Array{String,2}:
 "J00"  "Ad9"  "RSa"
 "oaT"  "vkM"  "znD"
 "JGS"  "QAF"  "WxF"
 "Gjs"  "UBF"  "0kV"

それをさらにA'短瞮できるかどうかは、 conjずadjointの非数より具䜓的には、非実数、非実数で䜕をしたいかによっお異なりたす。 -耇雑な倀。

[この号は、ω₁パヌトシリヌズの第2匟です。]

breaking decision linear algebra

最も参考になるコメント

OT倧成功を収めた6郚構成のミニシリヌズの次の蚘事である「7テン゜ルを真剣に受け止める」こずをすでに楜しみにしおいたす...

党おのコメント141件

前の問題ぞの論理埌継...👍

配列䞊で芁玠ごずに動䜜するconjの動䜜は、Matlabからの䞍幞なホヌルドオヌバヌのようなものであり、数孊的に正圓な操䜜ではありたせん。

これはたったく真実ではなく、 expたったく類䌌しおいたせん。 耇雑なベクトル空間ずその掻甚は、完党に確立された数孊的抂念です。 https://github.com/JuliaLang/julia/pull/19996#issuecomment-272312876も参照しお

耇雑なベクトル空間ずその共圹は、完党に確立された数孊的抂念です。

私が間違っおいない限り、その文脈での正しい数孊的掻甚操䜜は、 ctransposeではなくconj これはたさに私のポむントでした

julia> v = rand(3) + rand(3)*im
3-element Array{Complex{Float64},1}:
 0.0647959+0.289528im
  0.420534+0.338313im
  0.690841+0.150667im

julia> v'v
0.879291582684847 + 0.0im

julia> conj(v)*v
ERROR: DimensionMismatch("Cannot multiply two vectors")
Stacktrace:
 [1] *(::Array{Complex{Float64},1}, ::Array{Complex{Float64},1}) at ./linalg/rowvector.jl:180

recurキヌワヌドを䜿甚する堎合の問題は、最埌に確認したずころ、キヌワヌドを䜿甚するずパフォヌマンスが倧幅に䜎䞋するこずです。これは、これらの関数をベヌスケヌスで再垰的に呌び出す堎合に問題になりたす。スカラヌ。

ずにかく、1.0でキヌワヌドのパフォヌマンスの問題を修正する必芁がありたす。

@StefanKarpinski 、あなたは間違っおいたす。 随䌎を持たずにベクトル空間で耇玠共圹を持぀こずができたす—随䌎は、耇雑なベクトル空間だけでなく、ヒルベルト空間などを必芁ずする抂念です。

さらに、ヒルベルト空間がある堎合でも、耇玠共圹は随䌎ずは異なりたす。 たずえば、ℂⁿの耇玠列ベクトルの共圹は別の耇玠ベクトルですが、随䌎䜜甚玠は線圢挔算子「行ベクトル」です。

耇玠共圹は、 conj(v)*v乗算できるこずを意味するものではありたせん

ベクトル化されたconj非掚奚は、残りの提案ずは無関係です。 ベクトル空間での耇玠共圹の定矩に関する参考資料をいく぀か提䟛できたすか

https://en.wikipedia.org/wiki/Complexification#Complex_conjugation

この扱いはかなり圢匏的ですが、「耇玠共圹行列」たたは「耇玠共圹ベクトル」をグヌグルで怜玢するず、無数の䜿甚法が芋぀かりたす。

耇玠ベクトルを共圹ベクトルにマッピングするこず conjが珟圚行うこずが共圹コベクトル 'が行うこずずは異なる重芁な操䜜である堎合、 conj確実に維持できたす。 conjずadjointはスカラヌに同意したすが、配列では動䜜が異なるため、これにより区別されたす。

その堎合、 conj(A) conjは各芁玠でadjoint呌び出す必芁がありたすか 2x2行列の䟋ずしおの耇玠数の衚珟は、 conj呌び出すのではなく、 conj(A)が実際に各芁玠でadjointを呌び出す必芁があるこずを瀺唆したす。 これにより、 adjoint 、 conj 、およびconj.すべお異なる操䜜になりたす。

  1. adjoint  iずjむンデックスを亀換し、芁玠にadjointを再垰的にマッピングしたす。
  2. conj 芁玠にadjointをマップしたす。
  3. conj. 芁玠にconjをマップしたす。

conj(A)は、各芁玠でconjを呌び出す必芁がありたす。 耇玠数を2x2行列で衚す堎合、異なる耇玠数ベクトル空間がありたす。

たずえば、ベクトルの共圹の䞀般的な䜿甚法は、実数行列の固有倀の分析です。固有倀ず固有ベクトルは、耇玠共圹のペアで提䟛されたす。 ここで、実数の2x2行列の2d配列Aで衚されるブロック行列があり、2成分ベクトルの1d配列で衚されるブロックベクトルvに䜜甚するずしたす。 以䞋のための任意の固有倀λのA固有ベクトルでv 、我々は期埅しお二固有倀conj(λ)固有ベクトルずconj(v) 。 conjがadjoint再垰的に呌び出す堎合、これは機胜したせん。

最も䞀般的な方法で定矩された線圢挔算子の随䌎は内積の遞択にも䟝存するため、行列の堎合でも随䌎は共圹転眮ずは異なる堎合があるこずに泚意しおください。実際のアプリケヌションの倚くは、加重内積の皮類が適切であり、その堎合、行列の随䌎をずる適切な方法が倉わりたすしかし、 Matrix䞎えられるず、によっお䞎えられる暙準の内積に察応する随䌎をずるべきであるこずに同意したす。 dot(::Vector,::Vector) 。ただし、䞀郚のAbstractMatrix たたは他の線圢挔算子タむプがadjointをオヌバヌラむドしお別のこずを実行する可胜性は十分にありたす。

これに察応しお、3d配列を線圢挔算子ずしお定矩しおいないためたずえば、組み蟌みのarray3d * array2d挔算がないため、たずえば3d配列に察しお代数的に劥圓なadjoint(A)を定矩するこずにもいく぀かの困難がありたす。 。 たぶんadjointは、スカラヌ、1D、および2D配列に察しおのみデフォルトで定矩する必芁がありたすか

曎新ああ、いいですね3D配列にもctranspose定矩しおいたせん。 続ける。

OT倧成功を収めた6郚構成のミニシリヌズの次の蚘事である「7テン゜ルを真剣に受け止める」こずをすでに楜しみにしおいたす...

耇玠数を2x2行列で衚す堎合、異なる耇玠数ベクトル空間がありたす。

私はこれに埓っおいたせん–耇玠数の2x2行列衚珟は、芁玠ずしお耇玠スカラヌを持぀のずたったく同じように動䜜するはずです。 私は、䟋えば、私たちが定矩するず

m(z::Complex) = [z.re -z.im; z.im z.re]

そしお、任意の耇玠数ベクトルv堎合、このIDを保持する必芁がありたす。

conj(m.(v)) == m.(conj(v))

䟋をもっず詳しく説明しお、すでにmず通勀しおいるはずの'ず比范したすが、 。誀っおその通勀をm.(v)' == m.(v')が保持されたすが、私があなたを正しく理解しおいる堎合は、 @ stevengj 、 conj(m.(v)) == m.(conj(v))はすべきではありたせんか

conj(m(z))は== m(z)たす。

あなたのm(z)は、加算ず乗算の䞋での耇玠数の同型ですが、線圢代数の他の方法では同じオブゞェクトではないので、 conjふりをするべきではありたせん。 たずえば、 zが耇玠数スカラヌの堎合、 eigvals(z) == [z]ですが、 eigvals(m(z)) == [z, conj(z)]です。 m(z)トリックが耇雑な行列に拡匵されるず、このスペクトルの2倍は、たずえば反埩法に察しおトリッキヌな結果をもたらしたすたずえばこの論文を参照。

別の蚀い方をすれば、 zはすでに耇玠数ベクトル空間耇玠数䞊のベクトル空間ですが、2x2実数行列m(z)は実数䞊のベクトル空間ですあなた掛けるこずができたすm(z)実数による...あなたは"complexify"堎合はm(z)耇玠数を乗じお䟋えばm(z) * (2+3im) ないm(z) * m(2+3im) あなた元の耇玠ベクトル空間z同圢ではなくなった別の耇玠ベクトル空間を取埗したす。

この提案は、実際の改善をもたらすように芋えたす+1私は数孊的な偎面に぀いお考えおいたす

  • 私が理解しおいるように、掻甚は、ベクトル空間/ベクトルの係数を提䟛するリング読み取り数倀に察するアクションです。 このアクションは、リング䞊のベクトル空間の構築の線圢性によっお、共圹ずも呌ばれるベクトル空間およびそのマッピング、readmatricesに察しお別のアクションを匕き起こしたす。 したがっお、共圹は必然的に係数ぞの芁玠ごずの適甚によっお機胜したす。 Juliaの堎合、これは、ベクトルv 、 conj(v) = conj.(v)䞭心にあるこずを意味し、 conjに配列甚のメ゜ッドがあるか、スカラヌ専甚のメ゜ッドがあるかは蚭蚈䞊の遞択です。どちらも倧䞈倫そう complex-numbers-as-2x2-matricesの䟋に関するStevenのポむントは、これは係数が圢匏的/実際に実数であるベクトル空間であるため、掻甚はここでは効果がないずいうこずです。
  • adjoint密接に線圢代数を含む重芁なドメむンの倚くの基本的なのです代数的な意味を持っおいる参照1ず2ず3 、あたりにも物理孊の倧きなアプリケヌションで、すべおを。 adjointが远加された堎合、怜蚎䞭のアクションのキヌワヌド匕数を蚱可する必芁がありたす。ベクトル空間/関数解析では、このアクションは通垞、内積によっお誘導されるため、代わりにキヌワヌド匕数を圢匏にするこずができたす。 ゞュリアの転眮のために蚭蚈されたものは、これらのアプリケヌションずの競合を避ける必芁があるので、 adjointは少し高額だず思いたすか

@felixrehren 、随䌎を誘発する内積を指定するためにキヌワヌド匕数を䜿甚するこずはないず思いたす。 ベクトルのdotの意味を倉曎したい堎合ず同じように、代わりに別の型を䜿甚するず思いたす。

私の奜みは少し簡単でしょう

  • conjそのたた芁玠ごずに保持したす。
  • a'をadjoint(a)に察応させ、垞に再垰的にしたすしたがっお、芁玠にadjointが定矩されおいない文字列の配列などでは倱敗したす。
  • a.'をtranspose(a)に察応させ、再垰的ではないようにし permutedims 、芁玠のタむプを無芖したす。

非再垰的なadjointナヌスケヌスは実際には芋圓たりたせん。 䞀気に、再垰的なtransposeナヌスケヌスを想像するこずができたすが、 a.'をtranspose(a, recur=true)に倉曎する必芁があるアプリケヌションでは、同じように簡単に思えたす。別の関数transposerecursive(a)呌び出したす。 Baseでtransposerecursiveを定矩するこずもできたすが、これが必芁になるこずはめったにないので、実際に衚瀺されるかどうかを確認する必芁がありたす。

私は個人的に、これを単玔に保぀こずがナヌザヌにずっおそしお実装にずっお最も簡単であり、それでも線圢代数の面でかなり防埡できるず感じおいたす。

これたでのずころほずんどの線圢代数ルヌチンは、暙準の配列構造ず暙準の内積にかなり匷く根ざしおいたす。 行列たたはベクトルの各スロットに、「フィヌルド」の芁玠を配眮したす。 私は、フィヌルドの芁玠のために、私たちは気にするこずを䞻匵するだろう+ 、 * 、など、およびconjではなく、 transpose 。 フィヌルドが2x2の実数行列に少し䌌おいるが、 conj䞋で倉化する特別な耇雑な衚珟である堎合、それは問題ありたせん-それはconjプロパティです。 conj䞋で倉化しないのが2x2の実際のAbstractMatrixある堎合、おそらく、行列のそのような芁玠は随䌎䜜甚玠の䞋で倉化するべきではありたせん @stevengjは私が説明できるよりも良いず蚀いたした-耇玠数ず同型である可胜性がありたすが、それはすべおの点で同じように動䜜するずいう意味ではありたせん。

ずにかく、2x2の耇雑な䟋は、私には少し赀いニシンを感じたす。 再垰行列の動䜜の本圓の原因は、ブロック行列で線圢代数を実行するためのショヌトカットでした。 この特別なケヌスを適切に扱い、基盀ずなるシステムを簡玠化しおみたせんか

したがっお、私の「単玔化された」提案は次のようになりたす。

  • conjそのたた維持したすたたはAbstractArrayのビュヌにしたす
  • a'を(a')[i,j] == conj(a[j,i])ような非再垰的なビュヌにしたす
  • a.'を(a.')[i,j] == a[j,i]ような非再垰的なビュヌにしたす
  • ブロック行列などを凊理するためのBlockArrayタむプを導入したす Base 、たたはおそらく十分にサポヌトされたパッケヌゞで。 間違いなく、これはこの目的のためにMatrix{Matrix}よりもはるかに匷力で柔軟性がありたすが、同様に効率的です。

これらのルヌルは、ナヌザヌが受け入れお構築するのに十分シンプルだず思いたす。

PS- @ StefanKarpinski実甚䞊の理由から、再垰のブヌルキヌワヌド匕数は、転眮のビュヌでは機胜したせん。 ビュヌのタむプはブヌル倀に䟝存する堎合がありたす。

たた、他の堎所で蚀及したしたが、完党を期すためにここに远加したす。再垰転眮ビュヌには、ラップしおいる配列ず比范しお芁玠タむプが倉曎される可胜性があるずいう厄介なプロパティがありたす。 䟋 transpose(Vector{Vector}) -> RowVector{RowVector} 。 実行時のペナルティなしで、たたは出力タむプを蚈算するために掚論を呌び出すこずによっお、この芁玠タむプをRowVectorで取埗する方法を考えおいたせんでした。 蚀語の芳点からは、珟圚の振る舞い掚論を呌び出すは望たしくないず思いたす。

泚意ナヌザヌがconjを定矩しお別の型を返すこずを劚げるものは䜕もないので、 ConjArrayビュヌも、再垰的であるかどうかに関係なく、この問題に悩たされたす。

@stevengj –「耇雑な」2x2行列が、耇雑なベクトル空間ではなく圢匏的に実数のベクトル空間であるず指摘するのは理にかなっおいたすが、その点は、再垰的随䌎の元の動機に疑問を投げかけたす。 @andyferrisの提案は良くありたせん非再垰的な転眮ず随䌎。 耇雑な2x2の䟋ずブロック行列衚珟の䞡方が再垰的に随䌎䜜甚玠を「望んでいる」ずいう事実は瀺唆的ですが、その最初の䟋に぀いおのコメントを考えるず、非再垰的随䌎䜜甚玠が他にない堎合はないかず思いたす。より正確で䟿利です。

随䌎䜜甚玠が再垰的でない堎合、それは随䌎䜜甚玠ではありたせん。 それはただ間違っおいたす。

少し時間があれば、それをもう少し正圓化できたすか

ベクトルの随䌎は、それをスカラヌにマッピングする線圢挔算子でなければなりたせん。 ぀たり、 a'*a aがベクトルの堎合、 a'*aはスカラヌでなければなりたせん。 そしお、これは、定矩するプロパティがa'*A*a == (A'*a)'*aであるため、行列に察応する随䌎を誘発したす。

aがベクトルのベクトルである堎合、これはa' == adjoint(a)が再垰的でなければならないこずを意味したす。

OK、私はこれに埓うず思いたす。

再垰的な内積もありたす。

julia> norm([[3,4]])
5.0

julia> dot([[3,4]], [[3,4]])
25

明らかに、「随䌎」たたは「双数」たたは同様に再垰的である必芁がありたす。

䞭心的な質問は、すべおのベクトルa 、 bに察しおa' * b == dot(a,b)が必芁かどうかずいうこずだず思いたす。

別の方法は、 'が必ずしも随䌎䜜甚玠を返すずは限らないずいうこずです。これは、芁玠を転眮しおconjを通過させる単なる配列挔算です。 これはたたたた実際の芁玠たたは耇雑な芁玠の随䌎䜜甚玠です。

線圢代数の随䌎䜜甚玠に特別な名前ず特別な蚘号がある理由は1぀だけです。それは、内積ずの関係です。 これが、「共圹転眮」が重芁な操䜜であり、「行列の90床の共圹回転」が重芁でない理由です。 それは、ドットの補品に接続されおいない堎合は、「スワップの行ず列ずのコンゞュゲヌトするこずを単にアレむ動䜜」である䜕かを持぀ポむントはありたせん。

transposeず非共圹の「ドット積」の間の同様の関係を定矩できたす。これは、再垰的な転眮を䞻匵したす。 ただし、実際には内積ではない耇雑なデヌタの非共圹「ドット積」は、真の内積ほど頻繁には衚瀺されたせん。挔算子が耇玠数で蚘述されおいる堎合、双盎亀関係から発生したす。察称゚ルミヌト圢匏ではない圢匏—組み蟌みのJulia関数や線圢代数の䞀般的な甚語すらありたせんが、任意の非数倀配列の行ず列を亀換するこずは、特にブロヌドキャストでははるかに䞀般的です。 これが、 adjoint再垰的にしたたた、 transpose非再垰にするこずをサポヌトできる理由です。

そうですか。 したがっお、 '名前をadjointに倉曎するこずは、 conj ∘ transposeではないこずを明確にするために、倉曎の䞀郚になりたすか

再垰配列ず垞に混同しおいたのは、このコンテキストでのスカラヌずは䜕ですか 私がよく知っおいるすべおの堎合においお、ベクトルの芁玠はスカラヌであるず蚀われおいたす。 数孊者がブロックベクトル/行列構造を玙に曞いた堎合でも、これは、芁玠がおそらく実数たたは耇玠数である、より倧きなベクトル/行列の省略圢であるこずがわかりたす぀たり、 BlockArray 。 スカラヌは*䞋で乗算できるず期埅しおおり、スカラヌのタむプは通垞、ベクトルずデュアルの間で違いはありたせん。

@andyferris 、䞀般的なベクトル空間の堎合、スカラヌはベクトルに乗算できるリング数倀です。 3 * [[1,2], [3,4]]はできたすが、 [3,3] * [[1,2], [3,4]]はできたせん。 したがっお、 Array{Array{Number}}堎合でも、正しいスカラヌ型はNumberです。

同意したした-しかし、芁玠は通垞同じスカラヌであるず蚀われおいたすね

ずにかく、私が芋た治療法は、リングから始たり、それらからベクトル空間を構築したす。 リングは+ 、 *をサポヌトしたすが、 adjoint 、 dotなどをサポヌトする必芁がある凊理は芋たこずがありたせん。

申し蚳ありたせんが、モデル化しおいる基瀎ずなる数孊的オブゞェクトを理解しようずしおいたす。

それはあなたが「速蚘」によっお䜕を意味するか、そしおあなたが「芁玠」によっお䜕を意味するかによりたす。

たずえば、関数の有限サむズのベクトル、および無限次元挔算子の「行列」を持぀こずは非垞に䞀般的です。 たずえば、次の圢匏の巚芖的なマクスりェル方皋匏を考えおみ

image

この堎合、「芁玠」が3成分ベクトル堎である2成分ベクトルに䜜甚する線圢挔算子カヌルなどの2x2行列がありたす。 これらは、耇玠数のスカラヌ堎䞊のベクトルです。 ある意味で、ベクトルの「芁玠」は耇玠数空間内の個々のポむントにあるフィヌルドの個々のコンポヌネントですが、それはかなり曖昧です。

あるいは、もっず正確に蚀えば、ベクトルの係数を䜕らかの基準で蚘述するために垞にリングを䜿甚するこずはできたせんJuliaの配列の性質を考えるず、根拠がないわけではありたせん。

いずれにせよ、結果は䟝然ずしお随䌎䜜甚玠が再垰的でなければならないずいうこずですよね あなたが䜕をしおいるのかわかりたせん。

配列のオブゞェクトたたは芁玠はS匏たたは抜象的な数孊的オブゞェクトを衚す他のデヌタ構造である可胜性があり、隣接するものは乗算されるず別のオブゞェクトを返す可胜性があるため、絶察に根拠がないようにするこずができたす。たずえば、敎数です。

私は特定の点を指摘するのではなく、よりよく理解しようずしおいるだけです:)

確かに、䞊蚘では、随䌎䜜甚玠は再垰的です。 たずえば、䞊蚘のように、 [E, H] BlockVectorを無限に倚くの芁玠が耇雑なBlockVectorアプロヌチは実行䞍可胜だず思いたす。

たあありがずう。

だから、おそらく私はこの圢で私の考えを蒞留するこずができたす

ベクトルv堎合、 length(v)がベクトル空間の次元、぀たりベクトル空間の芁玠を完党に蚘述するために必芁なスカラヌ係数の数を衚すこずを期埅したす。たた、 v[i]はi番目のスカラヌ係数を返したす。 今日たで、私はAbstractVectorを「抜象的なベクトル」ずは考えおいたせんでしたが、プログラマヌが知っおいる䜕らかの基瀎を䞎えられたベクトル空間の芁玠の係数を保持するオブゞェクトず考えおいたした。

シンプルで䟿利なメンタルモデルのように芋えたしたが、おそらくこれは制限が倚すぎお実甚的ではありたせん。

線集 Vector{T}では、 Tは線圢代数挔算が機胜するためにスカラヌのように動䜜する必芁があるため、制限がありたす。

でも[3,3] * [[1,2], [3,4]]はできたせん

私たちはそれを修正するこずができたす。 それが良い考えかどうかはわかりたせんが、確かに機胜させるこずができたす。

それが望たしいかどうかはわかりたせん...この堎合、 [3,3]実際にはスカラヌではありたせん。 私たちはすでに[3,3]' * [[1,2], [3,4]]を実行する機胜を持っおいたす-これは線圢代数の意味で解釈する方法を本圓に知りたせん。

これは興味深いコヌナヌケヌスを瀺しおいたす。 v1' * v2は内積であるしたがっお「スカラヌ」を返すず蚀っおいるようですが、 [3,3]' * [[1,2], [3,4]] == [12, 18]です。 䞍自然な䟋だず思いたす。

その堎合、 [3,3]はスカラヌです。スカラヌは基瀎ずなるリングの芁玠であり、 [a,b]圢匏の芁玠をリングにするしたがっおベクトル/行列を定矩するための良い方法はたくさんありたす。その䞊。 それらがベクトルずしお曞かれおいるずいう事実、たたはこのリング自䜓が別の基瀎ずなるリングの䞊にベクトル空間を圢成しおいるずいう事実は、それを倉曎したせん。 ベクトルを隠す可胜性のある他の衚蚘法を採甚するこずもできたすたたは、たったく異なる倖芳にするこずもできたす。 @ andyferrisが取埗したように、スカラヌずはコンテキストによっお異なりたす。

正匏には、再垰は随䌎䜜甚玠の䞀郚ではありたせん。 代わりに、スカラヌ芁玠の掻甚は䜜業のその郚分を行いたす-そしお、スカラヌsが行列ずしお衚される堎合、 s掻甚には、私たちが衚すために䜿甚する行列の転眮が含たれるこずがよくありたすそれ。 ただし、垞にそうであるずは限りたせん。スカラヌのリングにナヌザヌが指定した構造に䟝存したす。

随䌎再垰を匷制するこずは、MATLABタむプのアプリケヌションで䞀般的な、実甚的な劥協案ずしおは問題ないず思いたす。 しかし、私にずっお、それを非垞に真剣に受け止めるずいうこずは、非再垰的な随䌎䜜甚玠ず型付きスカラヌ+ディスパッチを䜿甚しお、基になるリングの構造が䜕であれ、 conjに必芁な魔法を働かせるこずを意味したす。

その堎合、[3,3]はスカラヌです。スカラヌは基瀎ずなるリングの芁玠です。

そのようなスカラヌが+ 、 *定矩されたリングの芁玠ではないこずを陀いお。 *はサポヌトしおいたせん; [3,3] * [3,3]はできたせん。

随䌎再垰を匷制するこずは、MATLABタむプのアプリケヌションで䞀般的な、実甚的な劥協案ずしおは問題ないず思いたす。 しかし、私にずっお、それを非垞に真剣に受け止めるずいうこずは、非再垰的な随䌎䜜甚玠ず型付きスカラヌ+ディスパッチを䜿甚しお、基になるリングの構造が䜕であれ、 conjに必芁な魔法を働かせるこずを意味したす。

私たちが実甚的な構成をしたいのであれば、これは完党に問題なく、これたで行っおきたこずですが、基瀎ずなるスカラヌは完党にフラット化された配列のものであり、線圢代数が定矩されおいるようです。 。 BlockVectorずBlockMatrix およびBlockDiagonalなどを䜜成するテクノロゞヌがあり、完党に拡匵されたアレむの効率的でフラットなビュヌを提䟛したす。 「アプロヌチは、少なくずも実行可胜でなければなりたせん。 私はたた、入力するだけでナヌザヌフレンドリヌな再垰的なアプロヌチずしお、いく぀かの䜙分な文字ずしおになるず思いたすが起こるBlockMatrix([A B; C D])立掟読めるセマンティックず朜圚的に倚くのコヌドが䜕であるかず匕き換えにする-私は確信しおこれらのポむントは議論の䜙地がありたす。 ただし、これらすべおを実装するのはさらに手間がかかりたす。

@andyferrisそうです、 *が定矩されおいないため、リングではありたせん-しかし、 *簡単に定矩できるのず同じペヌゞにいるず思いたすが、そしおそれを行うには、リング構造を䞎えるさたざたな方法がありたす。 だから私たちは同じペヌゞにいるず思いたすタむピングはこれを解決するためのより拡匵可胜な方法です。

スカラヌに぀いおスカラヌは必ずしも完党に平坊化された構造の芁玠ではありたせん理由はこれです。1次元の耇玠ベクトル空間は耇玠数に察しお1次元であり、実数に察しお2次元です。どちらの衚珟もそうではありたせん。特別。クォヌタニオンは耇玠数に察しお2次元、オクトニオンは耇玠数に察しお2次元、耇玠数に察しお4次元、実数に察しお8次元です。しかし、オクトニオンが「8次元」であるず䞻匵する理由はありたせん。それらのスカラヌは耇玠数ではない実数であるず䞻匵するよりも、これらは論理によっお匷制されない遞択です。これは玔粋に衚珟の問題です。線圢代数はいずれの堎合も同じであるため、ナヌザヌはこの自由を蚱可する必芁がありたす。 [切り捚おられた]倚倚項匏リング、たたは数倀フィヌルドの代数的拡匵を䌎うこのような空間のはるかに長いチェヌン。どちらも行列で掻発に適甚されたす。ゞュリアはりサギの穎をこれほど遠くたで行く必芁はありたせんが、 それをブロックしないように、それが存圚するこずを芚えおおく必芁がありたす。 倚分談話のトピック :)

@felixrehren 、リングR䞊のベクトルのベクトルは、盎和空間ずしお最もよく理解されたす。これは、R䞊のベクトル空間でもありたす。ベクトル自䜓を「基になるリング」ず呌ぶのは無意味です。リング。 その掚論は[[1,2], [3,4]]に完党に圓おはたりたす。

共圹ず随䌎は通垞、別々の抂念です。 「スカラヌ芁玠の掻甚」がここでの䜜業を行うべきであるず蚀うこずは、以䞋に述べる特別な堎合を陀いお、「深刻な」の反察である私には完党に間違っおいるように思われたす。

ディラック蚘法で、あるリングたずえば耇玠数ℂ䞊のヒルベルト空間Hにある2぀の芁玠|u⟩ず|v⟩の「2成分列ベクトル」|u⟩、|v⟩の堎合を考えおみたしょう。 「ベクトルのベクトル」。 これは、自然な内積⟚|u⟩、|v⟩、|w⟩、|z⟩⟩=⟹u|w⟩+⟹v|z⟩を持぀盎和ヒルベルト空間H⊕Hです。 したがっお、随䌎䜜甚玠は「行ベクトル」⟚u|⟹v|からなる線圢挔算子を生成する必芁がありたす。その芁玠自䜓は線圢挔算子です。随䌎䜜甚玠は「再垰的」 。 これは、䞋局リングの共圹によっお誘導される同じヒルベルト空間H⊕Hの芁玠を生成する耇玠共圹ずはたったく異なりたす。

クォヌタニオンなどのベクトルを参照するこずで、問題を混乱させおいたす。 ベクトルの「芁玠」も基瀎ずなる「complexified」リングの芁玠である堎合には、圓然のこずながら随䌎し、これらの芁玠の耇合䜓は、同じものです。 ただし、これはすべおの盎接補品スペヌスに適甚できるわけではありたせん。

蚀い換えるず、オブゞェクトタむプは、2぀の異なる情報を瀺す必芁がありたす。

  • スカラヌリングしたがっお、同じ空間の芁玠を生成する共圹。
  • 内積したがっお、双察空間の芁玠を生成する随䌎。

Vector{T<:Number}堎合、スカラヌリングがT たたは耇雑化されたベクトル空間の堎合はcomplex(T) であり、内積が通垞のナヌクリッド積であるこずを瀺すものずしお読み取る必芁がありたす。 。

ベクトルのベクトルがある堎合、それは盎和ヒルベルト空間であり、リングは個々のベクトルのスカラヌリングの昇栌であり、内積は芁玠の内積の合蚈です。 スカラヌを昇栌できない堎合、たたは内積を合蚈できない堎合、それはベクトル/ヒルベルト空間ではありたせん。

スカラヌT<:Number堎合、 conj(x::T) == adjoint(x::T) 。

したがっお、耇玠数z::Complex{T}を2x2行列m(z)::Array{T,2}で衚珟しようずするず、タむプはzず比范しお異なるリングTず異なる内積の䞡方を瀺したす。 zであるため、 conjたたはadjointいずれかが同等の結果をもたらすこずを期埅するべきではありたせん。

@felixrehrenの蚀っおいるこずがわかりたす。 スカラヌが実数の堎合、オクテルニアンは8次元のベクトル空間ず考えるこずができたす。 しかし、スカラヌ係数がオクテルニアンである堎合、すべおのオクテルニアンを衚す自明な次元1の基瀎がありたす。 これが私が蚀ったこずたたは私が意味したこずsmile :)ず異なるかどうかはわかりたせんが、 AbstractVector{T1}がある堎合は、異なる次元のAbstractVector{T2}ず同型である可胜性がありたす length 。 ただし、 T1ずT2は、どちらもJulia挔算子+ず*䞋のリングである必芁がありたす同型写像は+動䜜を保持する可胜性がありたすただし、 * 、たたは内積たたは随䌎䜜甚玠ではありたせん。

@stevengj私はい぀もBlockVectorたったく同じように盎和を考えおきたした。 2぀の互いに玠な䞍完党な塩基がありたす。 各基底内で、最初の基底ではc₁|X₁⟩+c₂|X₂⟩、2番目の基底ではc₃|Y₁⟩+c₄|Y₂⟩のような重ね合わせを圢成できる堎合がありたす。 「盎和」は、c₁|X₁⟩+c₂|X₂⟩+c₃|Y₁⟩+c₄|Y₂⟩のような状態の空間を衚したす。 これを耇玠数の次元4の基底から分離する唯䞀の特別なこず぀たり、c₁|X₁⟩+c²|X₂⟩+c₃|Y₁⟩+c₄|Y₂⟩のような状態は括匧です-私には、それは衚蚘のようです。 盎和は、これらを玙に曞いたり、コンピュヌタヌの配列を䜿っお曞いたりするのに䟿利な方法ですたずえば、察称性をカタログ化しお利甚したり、問題を分割したりおそらく䞊列化するなどに圹立぀堎合がありたす。 。 この䟋では、X⊕Yは䟝然ずしおスカラヌが耇玠数である4次元のベクトル空間です。

これが、 eltype(v) == Vector{Complex{...}}ずlength(v) == 2ではなくeltype(v) == Complex{...}ずlength(v) == 4欲しい理由です。 これは、基になるリングずベクトル空間を確認しお掚論するのに圹立ちたす。 随䌎䜜甚玠を蚈算するために「グロヌバル」転眮ず芁玠ごずのconjを実行できるのも、この「フラット化された」空間ではありたせんか

私が1぀だけ曞いおいる間に2぀の投皿がありたした、 @ stevengj smile :)

もちろん、 BlockArrayではなく、珟圚のように盎和の芏則ずしおネストされた配列を䜿甚する堎合は、これも優れた䞀貫性がありたす。 スカラヌ堎䞀皮の再垰的eltypeず、有効な平坊化された次元䞀皮の再垰的サむズを決定するためのいく぀かの远加関数を利甚しお、実行しおいる線圢代数に぀いお少し簡単に掚論できるようにするこずができたす。

明確にするために、私は䞡方のアプロヌチに満足しおおり、この議論から倚くのこずを孊びたした。 ありがずう。

@ andyferris 、2぀の空間が同型であるからずいっお、それらが「同じ」空間であるずは限りたせん。どちらが「本圓に」ベクトル空間であるかたたは「本圓に」同じかどうかに぀いお議論するこずは圢而䞊孊的な泥沌です。そこから逃げるこずはありたせん。 しかし、無限次元のベクトル空間の盎和の堎合は、「䞀方のすべおの芁玠の埌に他方のすべおの芁玠が続く」ずいう盎和の「平坊化された」抂念の制限を瀺しおいたす。

繰り返したすが、私はあなたのポむントが䜕であるかわかりたせん。 Juliaのeltype(::Vector{Vector{Complex}})をComplexにするこず、たたはlengthが長さの合蚈を返すこずを真剣に提案しおいたすか ゞュリアの誰もが盎和空間にあなたの「平坊化された」同型を採甚するこずを匷制されるべきだず そうでない堎合、随䌎䜜甚玠は再垰的でなければなりたせん。

たた、「特定の点を指摘するのではなく、よりよく理解しようずしおいる」堎合は、別のフォヌラムに持ち蟌むこずができたすか この問題は、盎和空間の意味に぀いお圢而䞊孊的な議論がなければ十分に混乱したす。

2぀のスペヌスが同型であるからずいっお、それらが「同じ」スペヌスであるずは限りたせん。

私は絶察にそれを瀺唆しおいたせんでした。

繰り返したすが、私はあなたのポむントが䜕であるかわかりたせん

AbstractArrayで線圢代数を実行したい堎合は、 eltype方がリングであるこずが真剣に提案されおいたす + 、 * 、およびconjサポヌト [1,2] * [3,4]が機胜しないため、たずえばVector eltypeを陀倖したす。 そしお、ベクトルのlengthは、実際には線圢代数の次元を衚したす。 はい、これは無限次元のベクトル空間を陀倖したすが、䞀般的にJuliaではAbstractVectorを無限のサむズにするこずはできたせん。 これにより、Juliaで線圢代数機胜を実装および䜿甚する方法に぀いお掚論しやすくなるず思いたす。 ただし、ナヌザヌは、ネストされた配列構造を䜿甚するのではなく、 BlockArrayなどを介しお盎接合蚈を明瀺的に瀺す必芁がありたす。

これは非垞に画期的な提案であり、顕著な欠点がありたすあなたが蚀及したものもありたすので、「それはいい考えですが、実甚的ではない」ず蚀っおも䞍幞になるこずはありたせん。 ただし、ネストされた配列アプロヌチでは、基瀎ずなる線圢代数に関するいく぀かのこずが少し䞍透明になるこずも指摘しようずしおいたす。

これはすべお、OPに盎接関連しおいるようです。 匷制的な平坊化アプロヌチでは、再垰的転眮/随䌎を砎棄したす。再垰的転眮/随䌎を砎棄した堎合、線圢代数では平坊化された構造のみが実行可胜になりたす。 平坊化されたアプロヌチを匷制しない堎合は、再垰的な随䌎䜜甚玠を維持する必芁がありたす。 私には、それは関連した決定であるように思われたした。

Juliaのeltype(::Vector{Vector{Complex}})をComplexにするこず、たたはlengthが長さの合蚈を返すこずを真剣に提案しおいたすか

いいえ、申し蚳ありたせんが、私が曞いた内容が明確ではなかった可胜性がありたす。特定の状況では、この目的のための2぀の新しい䟿利な機胜が圹立぀可胜性があるこずを瀺唆しただけです。 たずえば、そのリングのzeroたたはoneが必芁な堎合がありたす。

ゞュリアの誰もが盎和空間にあなたの「平坊化された」同型を採甚するこずを匷制されるべきだず蚀っおいたすか

可胜性ずしお、そうだず提案しおいたした。 私はそれが最善のアむデアであるず100確信しおいるわけではありたせんが、いく぀かの利点およびいく぀かの欠点があるず感じおいたす。

ここで実行可胜な倉曎の領域に戻るず、 @ stevengjの提案の簡略化されたバヌゞョンが、ここに進む方法のようです。

  • conjそのたた芁玠ごずに保持したす。
  • a'をadjoint(a)に察応させ、垞に再垰的にしたすしたがっお、芁玠に随䌎が定矩されおいない文字列の配列などでは倱敗したす。
  • a.'をtranspose(a)に察応させ、再垰的ではないようにし permutedims 、芁玠のタむプを無芖したす。

これから抜出できる䞻な実際の「todo」は次のずおりです。

  1. [] ctranspose名前をadjointたす。
  2. [] transposeを非再垰的に倉曎したす。
  3. []これが行ベクトルにどのように適合するかを理解したす。

再垰的転眮に䟝存するこずは十分にたれであるため、これを1.0で倉曎しお、NEWSで壊れおいるずリストするこずができるず思いたす。 ctransposeをadjointに倉曎するず、通垞の非掚奚になる可胜性がありたすただし、1.0ではこれを行いたす。 他にやらなければならないこずはありたすか

@StefanKarpinski 、察応する倉曎をRowVectorに加える必芁もありたす。 1぀の可胜性は、 RowVectorをTranspose Adjointタむプずtransposeずレむゞヌ再垰adjointをそれぞれ䜿甚するこずです。そしおConj 怠惰なconj を取り陀くために。

少なくずも接線方向に関連するいく぀かの倉曎

  • 以䞋のためのいく぀かのビュヌタむプtransposeずadjointのAbstractMatrix
  • adjoint(::Diagonal)再垰的にしたすおそらく、Juliav0.6.0より前のtransposeずctranspose Diagonalでこの「バグ」を修正する必芁がありたす
  • 次のような適切な「スカラヌ」タむプを䜿甚したす。 v = Vector{Vector{Float64}}(); dot(v,v) 珟圚ぱラヌ- zero(Vector{Float64})を返そうずしたす

OK、私は再垰的な区分行列をより真剣に受け止めようずしおおり、これをバックアップするために、ここでDiagonalの動䜜も改善しようずしおいたすブロック察角を予枬するいく぀かの方法がすでにありたす getindexなどの構造なので、この堎合は転眮を再垰的にするのが自然なようです。

私が行き詰たり、䞊蚘のすべおの議論のポむントを盎接動機付けたのは、 inv 、 det 、 expmを含むそのような構造で線圢代数挔算を行う方法です。 eigなど。 たずえば、すべおの察角芁玠の積をずるdet(::Diagonal{T}) where Tメ゜ッドがありたす。 T <: Numberで芋事に機胜し、すべおの芁玠が同じサむズの正方行列たす。 圌らは同じサむズの正方行列である堎合はもちろん、その埌の芁玠が環を圢成し、そしおそれはすべおの非垞に賢明だ-たた、再垰転眮線集随䌎が正しいものです。

ただし、䞀般的なブロック察角行列Diagonal{Matrix{T}} 、たたは任意のブロック行列Matrix{Matrix{T}}を考えるず、その行列匏は䞀般にスカラヌTず蚀えたす。 ぀たり、サむズが(3 ⊕ 4) × (3 ⊕ 4) 3×3、4×4の次元の行列であり、䞀臎する非察角芁玠である察角芁玠を持぀2×2行列の堎合、 detは「平坊化された」7×7構造の行列匏ですか、それずも単に2×2の芁玠をそのたた乗算する必芁がありたすかこの堎合ぱラヌアりト

線集䞊蚘のディメンションをすべお異なるものに倉曎したした。これにより、あいたいな蚀語を避けるこずができたす

a'が再垰的であるこずに問題はありたせんが、個人的には、新しいa.'衚蚘が非垞に混乱しおいるこずに気付くでしょう。 構文a.'を芋せおくれたら、ゞュリアのメンタルモデルに基づいお、 transpose.(a)぀たりa芁玠ごずの転眮を実行するず蚀いたす。違う。 たたは、 a'ずa.'䞡方が転眮のオプションであり、そのうちの1぀も芁玠ごずに再垰するこずを瀺した堎合、 a.'は芁玠ごずの再垰、そしお私は再び間違っおいるでしょう。

もちろん、この堎合、 .が䜕を意味するかに぀いおの私のメンタルモデルは間違っおいたす。 しかし、その構文をたったく間違った方法で解釈するのは私だけではないず思いたす。 そのためには、非再垰的な転眮に.'以倖のものを䜿甚するこずをお勧めしたす。

@rdeitsこの構文はMATLABから掟生しおいるず思いたす。 非垞に玠晎らしいドットコヌルブロヌドキャスト構文がv0.5に導入されるず、これは少し䞍幞になりたした。

MATLABずは別に独自のパスを䜜成し、これを倉曎するこずもできたすが、それに぀いおは別の議論があったず思いたす誰もがどこを芚えおいたすか。

ああ、それは残念です。 ありがずう

別のやるこず

  • [] issymmetricずishermitianを修正しお、 issymmetric transposeずadjointに䞀臎させたす。各ペアの前者は非再垰的で、埌者は再垰的です。

Matlabの.'構文は、新しい.構文のコンテキストでは間違いなく非垞に残念です。 これを倉曎するこずに反察する぀もりはありたせんが、転眮のための新しい構文が必芁であり、䜿甚できる構文があるかどうかはわかりたせん。 転眮の提案はありたすか

転眮構文の説明をここに移動したしょう https 

transpose / ctranspose / adjointが再垰的であるずいう匷い意芋はありたせんが、 A::Matrix{Matrix{T}}をブロック行列のように扱いたくありたせん。怠惰なhvcat感芚。これは、 @ andyferrisが少なくずも郚分的に暗瀺しおいるようです。 ぀たり、 Aの芁玠がすべお同じサむズの正方行列である堎合぀たり、リングを圢成する堎合、 det(A)はそのサむズの正方圢を再び返すず予想されたす。 長方圢たたはサむズが異なる堎合は、゚ラヌが発生する可胜性がありたす。

ずは蚀うものの、ブロック行列/怠惰な猫のタむプは䟿利かもしれたせんが、それはずっず行き枡り、フラット化されたデヌタを凊理するためにたずえばgetindexも定矩する必芁がありたす。 しかし、私はこの抂念がMatrixやDiagonalような他の既存のマトリックスタむプに吞収されるこずを絶察に望んでいたせん。

@martinholters、これは安心です。 このスレッドの前半で私がパニックに陥ったのは、Juliaの線圢代数フレヌムワヌク党䜓を任意のブロック行列郚分行列のサむズが異なるのMatrix{Matrix}に適甚できるはずだずいう考えでした。

私が「平坊化」で䞻匵しおいたのは、芁玠が䜕であるかに぀いおの掟手な内省を行うこずではなく、単に芁玠自䜓のメリットをリングの芁玠ずしお扱うこずです。 ただし、再垰的なctranspose / adjointはこれを拡匵しお、線圢挔算子のように機胜する芁玠を蚱可したす。これは正しくお䟿利なようです。 他の堎合は、ベクトルのように機胜するベクトルの芁玠であり、再垰的随䌎も正しいです。

もう少し戻るず、 transpose(x) = xずctranpsose(x) = conj(x)デフォルトのno-op動䜜を削陀する元の動機は䜕でしたか これらはい぀も私にずっお非垞に䟿利に思えたした。

もう少し戻るず、transposex= xおよびctranpsosex= conjxのデフォルトのno-op動䜜を削陀する元の動機は䜕でしたか これらはい぀も私にずっお非垞に䟿利に思えたした。

これは、 ctransposeを特殊化できなかったカスタム線圢挔算子タむプAbstractArrayのサブタむプにするこずはできたせんによっお動機付けられたした。 これは、フォヌルバックから誀ったno-op動䜜を継承したこずを意味したす。 フォヌルバックが黙っお間違っおしたうこずがないようにディスパッチを構成しようずしたしたただし、悲芳的な耇雑さがある可胜性がありたす。 https://github.com/JuliaLang/julia/issues/13171

2぀のオプションがあるようです。どちらの堎合も、 transposeは非再垰的になりたす。それ以倖の堎合は、次のようになりたす。

  1. 非再垰的なctranspose 。
  2. 再垰ctranspose 。

@ stevengj 、 @ jiahao 、 @ andreasnoack –ここでのあなたの奜みは䜕ですか その他

@jiahaoのJuliaCon2017の講挔以来、私はこれに぀いお倚くのこずを考えおきたした。

私には、線圢代数を芁玠タむプTずしお「スカラヌ」フィヌルドに関しお定矩する必芁があるず今でも感じおいたす。 Tがフィヌルドの堎合 + 、 * 、およびconj  - 、 / 、..もサポヌト 。 Base.LinAlgメ゜ッドが倱敗する理由がわかりたせん。

OTOHたずえば、ブロック行列の転眮に぀いお話すこずは非垞に䞀般的そしお有効です。 ここで「数孊」型理論から孊ぶこずができるず思いたす。たずえば、「1次」のスカラヌのセット、「2次」のスカラヌのセット、「3次」を䜿甚しお、セットのセットに぀いお議論するこずから生じる奇劙なステヌトメントを凊理しようずしたす。スカラヌのセットのセットの「順序」セットなど。 配列の配列を扱う堎合、ここでも同じ問題および機䌚があるず思いたす。Juliaの型システムを䜿甚しお、「真の」スカラヌの「1次」配列、スカラヌの配列の「2次」配列などを蚘述するこずができる可胜性がありたす。 。 @ stevengj 、私、および他の人の間の長い議論は、はい、任意の「順序」の配列に察しお自己矛盟のない䞀連の操䜜を思い付くこずができるずいう事実から生じたず思いたす。このフレヌムワヌクではc転眮は明確か぀正確に再垰的ですが、それを行う必芁はありたせん。 Jiahaoの話が明確に指摘しおいるように、プログラミング蚀語/フレヌムワヌクは、スカラヌを配列から区別するたたはしない、ベクトルを行列から区別するたたはしないなどに぀いお意味的な遞択を行いたす。これは私たちが行うこずができる関連する遞択だず思いたす。

私にずっお、ここで重芁な点は、「任意の順序」の配列を機胜させるには、通垞はベクトルず行列でのみ定矩されるいく぀かの操䜜を「スカラヌ」に教える必芁があるずいうこずです。 これを行う珟圚のJuliaメ゜ッドはtranspose(x::Number) = xです。 ただし、このメ゜ッドを削陀するこずで、配列ずスカラヌの意味䞊の区別を拡匵したいのですが、それはかなり実珟可胜かもしれないず思いたす。

次のステップは、1次行列ず2次行列の違いなどをBase.LinAlgに教えるこずです。 私は2぀の実行可胜なオプションを考えたした、もっずあるかもしれたせん、私は本圓に知りたせん

  • だから、オプトむン特色"arrayness"ぞのいく぀かの䞊べ替えを持っおいるtranspose(::AbstractMatrix{T})時に再垰的であるTあるAbstractMatOrVecずきではなく、 TありたすNumber 、それ以倖の堎合は䜕らかの方法で構成可胜オプトむン、オプトアりトなどにしたす。 いく぀かの点で、これは芁玠のtransposeメ゜ッドの動䜜を制埡するこずによっお行われおいたしたが、珟圚はouterのtransposeメ゜ッドの動䜜を制埡する方がクリヌンだず思いたす。 配列。
  • たたは、 Arrayを含むほずんどのAbstractArrayが1次であり芁玠はスカラヌフィヌルドである、別のAbstractArrayタむプたずえばNestedArray を䜿甚するこずを衚明したす。 配列をラップし、それらの芁玠がスカラヌではなく配列ずしお扱われるこずを「マヌク」したす。 これを少し詊しおみたしたが、䞊蚘のオプションの方がナヌザヌの負担が少ないようです。

Juliaは配列ずスカラヌを匷力にセマンティックに分離しおいるように感じたす。たた、スカラヌは配列プロパティtransposeに぀いお「教えられる」必芁があるため、珟圚の状況は私には少し矛盟しおいるように芋えたす。 ナヌザヌは、 Matrix{Float64}がスカラヌの行列1次配列であり、 Matrix{Matrix{Float64}}がブロック行列2次配列であるこずを明確に理解できたす。 型システムたたは特性を䜿甚しお、配列が「䞀次」であるかどうかを刀断する方が䞀貫しおいる堎合がありたす。 たた、最初にリストしたオプションを䜿甚するず、Juliaがよりナヌザヌフレンドリヌになり ["abc", "def"].'を実行できたす、ブロック行列を䜿甚しお実甚的で䟿利なデフォルトの凊理を実行できる柔軟性が維持されるず思いたす。

長い間ハヌプしお申し蚳ありたせんが、 JuliaConで@jiahaoず話した埌、ここでもう少しうたくやれるず感じたした。 @StefanKarpinskiが䞊蚘で蚀及した他のオプションを「機胜」させるこずができるず確信しおいたすが、 RowVectorが導入される前は、行列/ベクトル代数が「機胜」しおいたのず同じように「機胜」したす。

TLDRは- c  transpose再垰的にするかしないか-䞡方を実行させたす぀たり、構成可胜にしたす。

これらは良い点ですが、 (c)transposeが再垰的であるずいう苊情のほずんどすべおすべおではないにしおもは、 'ず.'非数孊的な䜿甚に関連しおいるこずを指摘したいず思いたす。 Vector{String}ずVector{PyObject}を1xn行列に再圢成する堎合。 タむプごずに修正するのは簡単ですが、面倒であるこずがわかりたす。 ただし、再垰的定矩は数孊的に正しいものであり、「䟿利だがたれな堎合は間違っおいる」よりも「正しいが倚くの堎合は煩わしい」の方が優れおいるず考えられおいたした。

考えられる解決策は、最初の箇条曞きでの提案です。぀たり、配列のような芁玠に察しお再垰的な転眮を行うこずだけです。 T<:AbstractVecOrMatは、ステヌタスを「䟿利だが非垞にたれなケヌスでは間違っおいる」に倉曎するほずんどのケヌスをカバヌするず思いたす。 それでも間違っおいる可胜性がある理由は、 AbstractArrayむンタヌフェむスが䞻に配列 getindex セマンティクスに関するものであるため、䞀郚の挔算子のような型がAbstractMatrixカテゎリに適合しないためです。 、線圢代数ではありたせん。

@andyferris 、スカラヌの随䌎および双察は完党に明確に定矩されおおり、 ctranspose(x::Number) = conj(x)は正しいです。

私の感じでは、 transposeほずんどの䜿甚法は「数孊的ではない」ものであり、 ctransposeほずんどの䜿甚法぀たり、掻甚行動が望たれる堎所での䜿甚はマシヌです掻甚する理由が他にないため 。 したがっお、私は非再垰的なtransposeず再垰的なctransposeを奜む傟向がありたす。

個人的には、ネストされたArraysずしおブロック配列を芋ようずするず、ここでの理由により耇雑になるず思いたす。https//github.com/KristofferC/BlockArrays.jlの専甚タむプを䜿甚する方がよいでしょう

@KristofferC、よさそうだ。

@stevengjが䞊で述べた非垞に有効な点が1぀ありたす。それは、芁玠が数孊的な意味でのベクトルや線圢挔算子である堎合がありたすが、 AbstractArrayではない堎合があるずいうこずです。 これらに察しお再垰的なc移調を行う方法が絶察に必芁です-これに぀いお考えたかどうかはわかりたせんが、私はそれに぀いお蚀及したいず思いたした。

このトピックに関するslack /linalg䌚話のハむラむト。 䞊蚘のスレッドの䞀郚を芁玄したす。 セマンティクスに焊点を圓お、スペルを回避したす。 その䌚話に参加したすべおの人に感謝したす:)

3぀の意味的に異なる操䜜が存圚したす。
1「数孊的随䌎䜜甚玠」再垰的で怠惰な
2「数孊的な転眮」理想的には再垰的で怠惰な
3「構造的転眮」理想的には非再垰的で「熱心」

珟圚の状況2次元C堎合、「数孊的な随䌎」はctranspose 、「数孊的な転眮」はtransposeに、「構造的な転眮」はpermutedims(C, (2, 1))にマップされたす。そしおreshape(C, 1, length(C))侀dimesionalのためのC 。 問題「構造的転眮」は䞀般的な操䜜であり、 permutedims / reshape話は、実際にはやや混乱/䞍自然/迷惑です。

それがどのように発生したか以前は、「構造転眮」は、 transpose(x::Any) = x 、 ctranspose(x::Any) = conj(x) 、 conj(x::Any) = xなどの䞀般的なno-opフォヌルバックを介しお「数孊随䌎」/「数孊転眮」ず混同されおいたした。 これらのフォヌルバックにより、ほずんどの堎合、 [c]transposeず関連する接尟蟞挔算子' / .'が「構造転眮」に䜿甚されたす。 すごい。 しかし、それらのタむプの[c]transpose特殊化の定矩がない堎合、䞀郚のナヌザヌ定矩の数倀タむプで[c]transposeを含む操䜜がサむレントに倱敗する誀った結果を返すこずもありたした。 痛い。 したがっお、これらの䞀般的なno-opフォヌルバックは削陀され、珟圚の状況が埗られたした。

問題は今䜕をすべきかです。

理想的な結果「構造的転眮」のための統䞀された、自然でコンパクトな呪文を提䟛したす。 意味的に正しい数孊的随䌎ず転眮を同時にサポヌトしたす。 䜿甚䞭たたは実装時にトリッキヌなコヌナヌケヌスを導入するこずは避けおください。

2぀の広い提案が存圚したす

1数孊的随䌎、数孊的転眮、および構造的転眮を、構文的および意味的に異なる3぀の挔算ずしお提䟛したす。 利点すべおが機胜し、抂念が明確に分離され、トリッキヌなコヌナヌケヌスが回避されたす。 欠点説明および実装する3぀の操䜜。

23぀の操䜜を2぀にシュヌホヌンしたす。 この提案には3぀の圢匏がありたす。

2a transpose意味的に「構造的転眮」にし、䞀般的な堎合には「数孊的転眮」ずしおも機胜したす。 利点2぀の操䜜。 明確なスカラヌ芁玠を持぀コンテナヌで期埅どおりに機胜したす。 欠点「数孊的な転眮」セマンティクスを期埅する人は誰でも、明確にスカラヌ芁玠を持぀コンテナヌよりも耇雑なオブゞェクトで誀った結果をサむレントに受け取りたす。 ナヌザヌがその問題を芋぀けた堎合、「数孊的な転眮」セマンティクスを実珟するには、新しいタむプやメ゜ッドを定矩する必芁がありたす。

2bタむプの「マシネス」を瀺す特性を導入したす。 オブゞェクトに随䌎/転眮を適甚するずきに、コンテナ/芁玠のタむプが「数孊」である堎合は、再垰したす。 そうでない堎合は、再垰しないでください。 利点2぀の操䜜。 さたざたな䞀般的なケヌスをカバヌできたす。 欠点䞀般的なno-op [c]transposeフォヌルバックず同じ問題が発生したす。぀たり、必芁な特性定矩がないナヌザヌ定矩の数倀タむプに察しお、サむレントに誀った結果が生じる可胜性がありたす。 「数孊」タむプぞの構造的転眮たたは「非数孊」タむプぞの数孊的転眮の適甚を有効にしたせん。 すべおの堎合においお、オブゞェクトが「数孊的」であるかどうかを刀断する方法が明確ではありたせん。 たずえば、芁玠タむプが抜象である堎合はどうなりたすか再垰的/非再垰的決定は、実行時ず芁玠ごず、たたは実行時であり、集合タむプをチェックするためにコンテナヌ内のすべおの芁玠に察しお最初のスむヌプが必芁ですか

2c adjoint  ctranspose 「数孊随䌎」ずtranspose 「数孊転眮」を維持し、 adjoint特化した䞀般的なフォヌルバックではないメ゜ッドを導入したす/非数倀スカラヌ型の堎合はtranspose 䟋 adjoint(s::AbstractString) = s 。 利点2぀の操䜜。 正しい数孊的セマンティクス。 欠点非数倀型にはadjoint / transpose断片的な定矩が必芁であり、ゞェネリックプログラミングが劚げられたす。 「数孊」タむプぞの構造転眮の適甚を有効にしたせん。

提案1および2aは、2bおよび2cよりも倧幅に幅広い支持を埗たした。

詳现に぀いおは、19344、21037、13171、およびslack /linalgを参照しおください。 ベスト

玠敵な蚘事をありがずう

オプション1に適した別の可胜性をテヌブルに眮きたいず思いたす。数孊行列ず衚圢匏デヌタ甚に異なるコンテナヌタむプを甚意したす。 その埌の意味A'の皮類によっお決定される可胜性がA 泚䞊述のようにではない、その芁玠型。 ここでの短所は、これには2぀の間に倚くのconvertが必芁になる可胜性がありそうなるでしょうか、もちろん、非垞に混乱を招く可胜性があるずいうこずです。 確かに、私は利益がこの混乱を正圓化するかどうかに぀いお懐疑的ですが、それでもそれに぀いお蚀及したいず思いたした。

おかげで、玠晎らしい蚘事。 1に投祚したす。

玠晎らしい蚘事。 1の堎合、スペルは次のようになるこずに泚意しおください。

  • 随䌎䜜甚玠 a' 再垰的、怠惰な
  • 数孊的転眮 conj(a') 再垰的、怠惰な
  • 構造転眮 a.' 非再垰的、熱心

したがっお、必ずしも新しい挔算子を導入する必芁はありたせん。数孊的な転眮は、随䌎ず共圹の怠惰で効率的な構成にすぎたせん。 最倧の問題は、2぀の類䌌した挔算子、぀たり接尟蟞'ず.' 、意味的にたったく異なるものになるこずです。 ただし、最も正しいゞェネリックコヌドでは、誰かが'たたは.'を䜿甚したかどうかは、「このこずの随䌎䜜甚玠をくれ」たたは「スワップ」を意味するかどうかの99正確な指暙であるず思いたす。このこずの寞法」。 さらに、誰かが' 、実際に「このこずの次元を亀換する」こずを意味する堎合、そのコヌドは、スカラヌ随䌎が自明でない芁玠耇玠数などを持぀行列に察しおすでに正しくありたせん。 誰かが実際に「これの随䌎の共圹を私に䞎えおください」を意味した残りのいく぀かのケヌスでは、実際には人々が実際にa.'を䜿甚するので、 conj(a')を曞くずその意味がはるかに明確になるず䞻匵したす「 aの寞法を入れ替える」ずいう意味です。

これに必芁なすべおの基瀎ずなるゞェネリック型を解明するこずは@ andyferrisず@andreasnoackはすでにこの問題に぀いおいく぀かの考えを持っおおり、可胜であるように思われたす。

この議論は他の堎所で行われたので、私も曎新する必芁があるず思いたした。 この提案に぀いお、私が完党に芋逃しおいた明らかなこ​​ずが1぀あったこずを認めたす。それは、線圢代数に.'を匕き続き䜿甚するず想定したこずですが、そうではないこずを認識しおおく必芁がありたす。 

たずえば、 vector.'はRowVectorである必芁はなくなりたす RowVectorは線圢代数の抂念であるため、「双察」ベクトルでの最初の詊みです。 Matrixたす。 線圢代数で「非共圹転眮」が必芁な堎合、実際に行っおいるのはconj(adjoint(a))を䜿甚するこずです。これを䜿甚し、すべおの線圢代数ナヌザヌに䜿甚するこずをお勧めしたすこれたではただ、䜿甚するMATLAB以来、長幎の「悪い」習慣だったa.'ではなくa'私は本圓のこずを知っおいた任意の行列たたはベクトルを転眮のため、私が本圓に望んずきだったadjoint たたはデュアル-名前の倉曎はここで倧きな助けになりたす。

たた、これにより興味深い空間が開かれるこずも簡単に指摘しおおきたす。 以前は、 vector'ずvector.'は、「デヌタ転眮」を実行し、デュアルベクトルのようなものを取埗するずいう二重のニヌズを満たす必芁がありたした。 .'は配列サむズを操䜜するためのものであり、 'は線圢代数の抂念であるため、 RowVectorを1D DualVectorなどに倉曎できる可胜性がありたす。完党に。 おそらく、ここでこれに぀いお議論するべきではありたせん-誰かがこれに食欲を持っおいるなら、別の問題を䜜りたしょう。

最埌に、提案されたアクションプランをSlackからコピヌしたす。

1 transposeをLinAlgからBaseに移動し、 RowVector䜜成されなくなったり、再垰的でなくなったりするこずに぀いおの譊告0.7のみを远加したす可胜な堎合
2どこでもctranspose名前をadjointたす
3 Vector 、 ConjVector 、 RowVectorが'ずconjず*組み合わせで機胜するこずを確認したす。 RowVector名前を倉曎したす。 ここでもconj(vector)怠惰にしたす。
4 conjおよびConjMatrixずもうたく盞互䜜甚する怠惰な行列随䌎䜜甚玠を導入する
5 A_mul_Bcなどを削陀したす。 A_mul_B!名前をmul! たたは*! に倉曎したす。
6利益

@stevengjは曞いた

@andyferris 、スカラヌの随䌎および双察は完党に明確に定矩されおおり、 ctranspose(x::Number) = conj(x)は正しいです。

蚘録のために、私は間違いなくこれに同意したす。

私の感じでは、転眮のほずんどの䜿甚法は「非数孊的」であり、ctranspose...のほずんどの䜿甚法は数孊的です

したがっお、アむデアはこれを圢匏化するこずです。 transposeすべおの䜿甚は「非数孊」になり、 adjointの唯䞀の䜿甚は「数孊」になりたす。

たずえば、 vector.'はRowVectorである必芁はなくなりたす RowVectorは線圢代数の抂念であるため、「双察」ベクトルでの最初の詊みです。 Matrixたす。

ただし、 .'を怠惰にしたいのです。 たずえば、 X .= f.(x, y.')はただ割り圓おられおいないはずです。

ここに質問がありたす issymmetric(::AbstractMatrix{<:AbstractMatrix})をどのように実装する必芁がありたすか transposeず䞀臎するのは、非再垰的なチェックでしょうか 私は実装を芋おいたす。 芁玠がtransposeできるこずを前提ずしおいたす。 OTOH issymmetric(::Matrix{String})かどうかを確認するこずは非垞に有効なようです...

Symmetric btwでラップされおいる堎合、珟圚は再垰的ではありたせん

julia> A = [rand(2, 2) for i in 1:2, j in 1:2]; A[1, 2] = A[2, 1]; As = Symmetric(A);

julia> issymmetric(A)
false

julia> issymmetric(As)
true

julia> A == As
true

はい、私はこのためのPRの䜜成に取り組んでおり、この皮の矛盟がたくさんありたす。 配列コヌドでtranspose 、 adjoint 、 conjすべおのむンスタンスを怜玢しおいるずきに、少し前にその問題に遭遇したした。

特に指瀺がない限り、 issymmetric(a) == (a == a.')およびishermitian(a) == (a == a')ような動䜜を実装したす。 これらはそれ自䜓かなり盎感的に芋え、AFAICTの既存のissymmetric䜿甚法は、 Number芁玠タむプ甚ですたたは、ネストされた配列にはあたり意味をなさない他の間違い/仮定が頻繁にありたす 。

代替の実装はissymmetric(a) == (a == conj(adjoint(a)))です...「きれい」ではなく、「デヌタ」配列 Stringなどでは機胜したせんが、 Number配列では䞀臎したす

特に指瀺がない限り、 issymmetric(a) == (a == a.')およびishermitian(a) == (a == a')ような動䜜を実装したす

私にずっお正しい解決策のようです。

曎新気が倉わった。 察称はおそらく䞻に線圢代数甚です

ほんの小さな提案です。2぀のベクトル dotu の積に察しお合蚈を行うず䟿利なこずがよくあり、スカラヌを返すx.’yはこれを行うための䟿利な方法です。 だから私はtranspose(::Vector)からMatrixを返さないこずに賛成です

はい、 RowVectorなるので、スカラヌを取埗する必芁がありたす。 転眮は再垰的ではないこずに泚意しおください。

おそらく接線のコメントで申し蚳ありたせんが、このスレッドの倚くの人々は「ベクトル空間のスカラヌのリング」に぀いお話し続けおいたす。 定矩䞊、ベクトル空間のスカラヌは、リングだけでなく、フィヌルドを圢成する必芁がありたす。 ベクトル空間に非垞に䌌おいるが、スカラヌがフィヌルドではなくリングを圢成するだけの代数的構造は「モゞュヌル」ず呌ばれたすが、モゞュヌルは少し難解すぎおBase ... erで凊理できないず思いたす。 ..モゞュヌル。

敎数配列をサポヌトしおいるため、ベクトル空間だけでなくモゞュヌルも効果的にサポヌトしおいたす。 もちろん、敎数配列を浮動小数点配列に埋め蟌たれたものずしお動䜜的に衚瀺するこずもできるため、それらはベクトル空間の郚分的な衚珟です。 ただし、モゞュラヌ敎数の配列を䜜成するこずもできたすたずえば。非玠数係数を䜿甚するず、どのフィヌルドにも自然に埋め蟌たれおいないリングを操䜜できたす。 芁するに、私たちは実際にはベクトル空間だけでなく䞀般的なモゞュヌルを怜蚎したいのですが、私たちの目的には倧きな違いはないず思いたす䞀般的には+ず*に぀いおのみ話したす

はい、ゞュリアは確かに、䞀般的なモゞュヌルず真のベクトル空間での代数挔算をサポヌトしおいたすそしおサポヌトする必芁がありたす。 しかし、私が理解しおいるように、コミュニティの䞀般的な哲孊は、 Base関数は、「「通垞の」䞀般的な線圢代数ルヌチン」を念頭に眮いお蚭蚈する必芁があるずいうものです。たずえば、敎数行列の正確な線圢代数蚈算では、 Base属しおいないので、基本的な蚭蚈䞊の決定を行うずきは、スカラヌがフィヌルドを圢成するず想定する必芁がありたす。 あなたが蚀ったように、実際には、それは実際には重芁ではありたせん。

クロスポストhttps://github.com/JuliaLang/julia/pull/23424#issuecomment-346678279

このプルリク゚ストが衚す5332ず20978を前進させる努力に感謝し、関連する蚈画のほずんどに参加しおいたす。 たた、このプルリク゚ストが進める甚語の遞択ずダりンストリヌムぞの圱響に぀いおも参加したいず思いたす。そのため、これらの遞択によっお利甚可胜な最良のトレヌドオフが埗られるこずを定期的に確信しおください。

その立堎を自分に玍埗させようずするたびに、私は同じ䞀連の䞍安に座瀁したす。 これらの䞍安の1぀は、この遞択がLinAlg匷い実装の耇雑さです。転眮ず配列反転を圧瞮するず、 LinAlgが䞡方を凊理するようになり、 LinAlgがはるかに倧きなセットをサポヌトする必芁がありたす。䞀般的な操䜜での型の組み合わせ。

説明のために、 mul(A, B)考えおみたしょう。ここで、 AずBは、裞、随䌎ラップ、転眮ラップ、たたは配列フリップラップされたMatrixです。 転眮ず配列反転を混同しない限り、 Aは、 Matrix 、随䌎でラップされたMatrix 、たたは転眮でラップされたMatrix および同様にB 。 したがっお、 mul(A, B)は9぀のタむプの組み合わせをサポヌトする必芁がありたす。 しかし、転眮ず配列フリップを混同するず、 Aは、 Matrix 、随䌎ラップされたMatrix 、転眮ラップされたMatrix 、たたは配列になる可胜性がありたす-フリップラップされたMatrix および同様にB 。 したがっお、 mul(A, B)は16皮類の組み合わせをサポヌトする必芁がありたす。

この問題は、匕数の数ずずもに指数関数的に悪化したす。 たずえば、コンフィレヌションがない堎合、 mul!(C, A, B)は27のタむプの組み合わせをサポヌトする必芁がありたすが、コンフィレヌションがある堎合、 mul!(C, A, B)は64のタむプの組み合わせをサポヌトする必芁がありたす。 そしおもちろん、 Vectorず非Matrix行列/挔算子タむプをミックスに远加するず、事態はさらに耇雑になりたす。

この副䜜甚は、この倉曎を進める前に怜蚎する䟡倀があるようです。 ベスト

この投皿では、github、slack、triageに関する最近の議論を統合/レビュヌし、今埌の可胜性のあるパスを分析したす。 https://github.com/JuliaLang/julia/issues/20978#issuecomment-315902532の粟神的な埌継者は、1.0に到達する方法に぀いお考えるこずから生たれたした。

3぀の意味的に異なる操䜜が問題になっおいたす

  • 随䌎線圢代数、再垰的、理想的にはデフォルトで怠惰
  • 転眮線圢代数、再垰、デフォルトでは理想的には怠惰
  • array-flipabstract-array-ic、non-recursive、理想的にはデフォルトで「lazy」

マスタヌでのこれらの操䜜のステヌタス

  • 随䌎䜜甚玠はadjoint / 'ず呌ばれたすただし、 '陀いお熱心です-特別にA[c|t]_(mul|rdiv|ldiv)_B[c|t][!]呌び出しに䞋げられた匏を含み、䞭間の熱心な随䌎䜜甚玠/転眮を回避したす 。

  • 転眮はtranspose / .'ず呌ばれたす adjointず同じ泚意が必芁です。

  • 配列フリップは、2次元のCはpermutedims(C, (2, 1))ず呌ばれ、1次元のC reshape(C, 1, length(C))ず呌ばれたす。

関連する問題

  1. 5332 A[c|t]_(mul|rdiv|ldiv)_B[c|t]ぞの特別な倀䞋げず、それに関連するメ゜ッド名の組み合わせコレクションは、1.0たでに消えるはずです。 その特別な䞋降/関連するメ゜ッド名を削陀するには、怠惰な随䌎ず転眮が必芁です。

  2. 13171随䌎née ctranspose ず転眮は、以前はtranspose(x::Any) = x 、 ctranspose(x::Any) = conj(x) 、 conj(x::Any) = xなどの䞀般的なno-opフォヌルバックを介しお配列フリップず混同されおいたした。 これらのフォヌルバックにより、䞀郚のナヌザヌ定矩の数倀タむプで[c]transposeを含む操䜜は、それらのタむプの[c]transpose特殊化がないず、サむレントに倱敗したす誀った結果を返したす。 間違った結果を黙っお返すのは悪いニュヌスなので、それらのフォヌルバックは削陀されたした17075。 より倚くのサむレント障害を導入しないこずは玠晎らしいこずです。

  3. 17075、17374、19205先行するフォヌルバックを削陀するず、配列フリップの利䟿性が䜎䞋したした。 そしお、謝眪、私のせいで関連する非掚奚の譊告ず盞たっお、その削陀は䞀時的に苊情を匕き起こしたした。 配列フリップのより䟿利な呪文がいいでしょう。

  4. 210371.0の今や混乱しおいる.'構文を削陀するずいいでしょう。 この倉曎を有効にするには、䞊蚘の特別な䞋降を削陀する必芁がありたす。

これらの問題を解決するための蚭蚈目暙

特別な䞋降および関連するメ゜ッド名を削陀し、サむレント゚ラヌの発生を回避し、転眮および配列フリップに盎感的で䟿利な呪文を提䟛し、 .'を削陀したす。 最小限の远加の耇雑さず砎損で前述のこずを達成したす。

デザむン提案

この分野は、2぀の蚭蚈提案に絞り蟌たれおいたす。

  1. 随䌎䜜甚玠adjoint呌び出し、 conjadjoint 「随䌎䜜甚玠」を転眮し、 transposeを配列反転したす。 adjointずconjadjointはLinAlgに䜏んでおり、 transposeはBase䜏んでいたす。

  2. 随䌎adjoint呌び出し、 transpose転眮し、 flipを配列反転したす。 adjointずtransposeはLinAlgに䜏んでおり、 flipはBase䜏んでいたす。

䞀芋するず、これらの提案は衚面的にしか異なっおいないように芋えたす。 しかし、さらに調査するず、実際的な違いが明らかになりたす。 これらの呜名スキヌムの盞察的な衚面的なメリットに぀いおの議論を避けお、それらの深い実際的な違いを芋おみたしょう。

違い、高レベルのビュヌ

  1. 耇雑

    提案1は、array-flip transpose呌び出すこずにより、転眮ず随䌎に加えお、 LinAlgにarray-flipの凊理を匷制したす。 したがっお、 LinAlgは、䞀般的な操䜜でサポヌトされる型の組み合わせのセットを倧幅に拡匵する必芁がありたす。 https://github.com/JuliaLang/julia/pull/23424#issuecomment -346678279は、䟋ずしおこの远加の耇雑さを瀺しおいたす。以䞋の説明では、远加の耇雑さの存圚を暗黙的に確認しおいたす。

    提案2が必芁ですLinAlg唯䞀の転眮サポヌトおよび随䌎、 LinAlg今ありたせんが。

  2. 砎損

    提案1は、既存の操䜜の基本的なセマンティクスを倉曎したす。 transposeは転眮ではなく配列フリップになり、それに応じおすべおのtranspose関連の機胜を倉曎する必芁がありたす。 たずえば、 transposeずいう名前に関連付けられたLinAlgすべおの乗算および巊/右陀算挔算では、セマンティックの修正が必芁になりたす。この倉曎の実珟方法によっおは、この倉曎によりサむレント砎損が発生したす。珟圚のセマンティクスが䟝存しおいる堎合はい぀でも意図的たたは䞍泚意に。

    提案2は、既存のすべおの操䜜の基本的なセマンティクスを保持しおいたす。

  3. カップリング

    提案1は、線圢代数の抂念転眮をBaseに、抜象配列の抂念array-flipをLinAlgに持ち蟌み、 BaseずLinAlg匷力に結合したす。

    提案2は、抜象的な配列ず線圢代数を明確に分離し、前者はベヌスのみに、埌者はLinAlgのみに存圚し、新しい結合はありたせん。

  4. サむレントvs.ラりド障害

    提案1は、転眮セマンティクスを期埅しおtransposeを呌び出すず、サむレントに誀った結果になりたすただし、代わりに配列フリップセマンティクスを取埗したす。

    提案2のアナログは、配列フリップセマンティクスを期埅する非数倀配列でtransposeを呌び出しおいたす。 この堎合、 transposeぱラヌをスロヌしお、ナヌザヌにflip瀺すのに圹立ちたす。

  5. .'  .'非掚奚にしないための䞻な匕数は、 transposeの長さです。 提案1は、 .'をtransposeおよびconjadjointずいう名前に眮き換えたすが、この状況は改善されたせん。 察照的に、提案2はflipずtransposeずいう名前を提䟛し、その状況を改善したす。

1.0ぞのパスの違い

各提案の䞋で1.0に到達するには䜕が必芁ですか 1.0ぞのパスは、提案2の方が簡単なので、そこから始めたしょう。

提案2の䞋での1.0ぞの道

  1. LinAlgに怠惰な随䌎および転眮ラッパヌタむプを導入したす。たずえば、 AdjointずTransposeです。 mul[!] / ldiv[!] / rdiv[!]メ゜ッドを導入し、これらのラッパヌタむプにディスパッチし、察応するA[c|t]_{mul|ldiv|rdiv}_B[c|t][!]メ゜ッドのコヌドを含めたす。 前者のメ゜ッドの短い子ずしお埌者のメ゜ッドを再実装したす。

    この手順は䜕も䞭断せず、 .'の特別な匕き䞋げの削陀ず非掚奚の䞡方を即座に有効にしたす。

  2. A[c|t]_{mul|ldiv|rdiv}_B[c|t]を生成する特別な䞋げを削陀したす。代わりに、単に' / .'をAdjoint / Transpose䞋げたす。 以前は特別に䞋げられた匏でA[c|t]_{mul|ldiv|rdiv}_B[c|t]呌び出しが発生し、代わりに同等のmul / ldiv / rdiv呌び出しになりたす。 A[c|t]_{mul|ldiv|rdiv}_B[c|t][!]を察応するmul[!] / ldiv[!] / rdiv[!]メ゜ッドに非掚奚にしたす。 .'掚奚にしたす。

    これらの手順は0.7で実行できたす。 それらは2぀のこずだけを壊したす1非Base / LinAlgタむプのA[c|t]_{mul|ldiv|rdiv}_B[c|t]メ゜ッドをヒットするために特別な䞋げに䟝存するコヌドは壊れたす。 このようなコヌドは、明瀺的なMethodErrorを発行し、新しい䜎䞋が䜕をもたらすか/壊れたコヌドを䜕に移行する必芁があるかを瀺したす。 2分離された' s / .'䟝存するコヌドは、厳密に熱心に動䜜するず壊れたす。 䞀般的な障害モヌドも明瀺的なMethodError必芁がありたす。 至る所で、砎損は制限され、隒々しいです。

    1.0に厳密に必芁な倉曎に぀いおは以䞊です。

    この時点で、 Adjoint(A) / Transpose(A)は怠惰な随䌎䜜甚玠ず転眮を生成し、 adjoint(A) / transpose(A)は熱心な随䌎䜜甚玠ず転眮を生成したす。 埌者の名前は無期限に残るか、必芁に応じお、0.7の他のスペル、たずえばeagereval(Adjoint(A)) / eagereval(Transpose(A))モゞュロスペルのeagerevalたたはeageradjoint(A)廃止される可胜性がありたす。 eagertranspose(A) 。 非掚奚の堎合、 adjoint / transposeは1.0で再利甚できたすただし、 Adjoint(A) / Transpose(A)がありたすが、そうなるかどうかはわかりたせん。必芁。

    最終的に...

  3. Base flipおよび/たたはFlipを導入したす。 機胜の远加であるため、この倉曎は必芁に応じお1.xで発生する可胜性がありたす。

提案1の䞋での1.0ぞの道

提案1はどうですか 以䞋に、2぀の可胜なパスの抂芁を瀺したす。 最初のパスは0.7の倉曎を統合したすが、サむレントブレヌクを䌎いたす。 2番目のパスは、サむレントブレヌクを回避したすが、0.7-> 1.0の倉曎が倚く含たれたす。 どちらのアりトラむンも、コヌドベヌスを継続的に進化させおいたす。 継続性の䜎い同等物は、䞀郚の䜜業/チャヌンを統合/回避する可胜性がありたすが、より困難で゚ラヌが発生しやすい可胜性がありたす。 進行䞭の䜜業は、最初のパスをたどっおいるようです。

提案1の最初のパスサむレントブレヌクあり
  1. transposeのセマンティクスを転眮から配列フリップに倉曎し、必然的にすべおのtranspose関連機胜のセマンティクスも倉曎したす。 たずえば、 At_...始たるたたは..._Bt[!]終わるすべおのA[c|t]_{mul|ldiv|rdiv}_B[c|t][!]メ゜ッドは、セマンティックリビゞョンが必芁になる可胜性がありたす。 たた、たずえばSymmetric / issymmetricの定矩ず動䜜も倉曎する必芁がありたす。 transpose自䜓をBaseたす。

    これらの倉曎は、静かにそしお広く壊れるでしょう。

  2. LinAlg conjadjointを導入したす。 このステップでは、前のステップで觊れたすべおのメ゜ッドを埩元する必芁がありたすが、元のセマンティック圢匏で、 conjadjoint関連付けられた異なる名前たずえば、 Aca_...ず..._Bca[!]名前を䜿甚したす。 。 たた、配列フリップ珟圚はtranspose 、転眮珟圚はconjadjoint 、およびLinAlg随䌎を同時にサポヌトする远加の型の組み合わせのメ゜ッドを远加する必芁がありたすたずえば、 ca A[c|t|ca]_{mul|ldiv|rdiv}_B[c|t|ca][!]䞭のcaバリアント。

  3. ず呌ば怠惰な随䌎し、転眮を玹介conjadjointで LinAlg蚀う、 AdjointずConjAdjoint 。 Baseにレむゞヌ配列フリップ transposeず呌ばれるラッパヌタむプを導入したす䟋 Transpose 。 mul[!] / ldiv[!] / rdiv[!]メ゜ッドを導入し、これらのラッパヌタむプにディスパッチし、察応するA[c|t|ca]_{mul|ldiv|rdiv}_B[c|t|ca][!]メ゜ッドのコヌドを含めたす。 前者のメ゜ッドの短い子ずしお埌者のメ゜ッドを再実装したす。

  4. A[c|t]_{mul|ldiv|rdiv}_B[c|t]を生成する特別な䞋げを削陀したす。代わりに、単に' / .'をAdjoint / Transpose䞋げたす。 以前は特別に䞋げられた匏でA[c|t]_{mul|ldiv|rdiv}_B[c|t]呌び出しが発生し、代わりに同等のmul / ldiv / rdiv呌び出しになりたすただし、セマンティクスはサむレントに倉曎されるこずを思い出しおください。 A[c|t]_{mul|ldiv|rdiv}_B[c|t][!]を察応するmul[!] / ldiv[!] / rdiv[!]メ゜ッドに非掚奚にしたす。 同様に、最近導入されたAca_... / ...Bca[!]メ゜ッドを削陀しお、 mul[!] / ldiv[!] / rdiv[!]盞圓するものを優先したす。 .'掚奚にしたす。

これらの倉曎は0.7で行う必芁がありたす。 既存の操䜜に察するセマンティックの倉曎は、広範囲にわたるサむレントな砎損をもたらしたす。 特別な䞋降陀去は、䞊蚘ず同じ閉じ蟌められた倧きな砎損をもたらしたす。

この時点で、 Adjoint(A) / Transpose(A) / ConjAdjoint(A)はそれぞれ、怠惰な随䌎、配列反転、転眮、およびadjoint(A) / transpose(A) / conjadjoint(A)はそれぞれ、熱心な随䌎、配列反転、転眮を生成したす。 埌者の名前は無期限に残るか、必芁に応じお、0.7でも他のスペルに廃止される可胜性がありたす䞊蚘を参照。

このプロセスの早い段階でConjAdjoint導入しお、䞀郚の䜜業/チャヌンを統合/回避するこずができたすが、このアプロヌチはより困難で゚ラヌが発生しやすい可胜性がありたす。

提案1の2番目のパスサむレントブレヌクを回避
  1. LinAlg熱心なconjadjointを導入したす。 珟圚transpose関連付けられおいるすべおの機胜ずメ゜ッドたずえば、 tを含むA[c|t]_{mul|ldiv|rdiv}_B[c|t][!]メ゜ッドを含むをconjadjointず掟生名に移行したす。 すべおのtranspose関連の名前を、新しいconjadjoint盞圓するものの短い子にしたす。 すべおのtranspose関連の名前をconjadjoint盞圓するものに非掚奚にしたす。

  2. LinAlgにレむゞヌ随䌎および転眮 conjadjointず呌ばれるラッパヌタむプを導入したす。たずえば、 AdjointずConjAdjointです。 mul[!] / ldiv[!] / rdiv[!]メ゜ッドを導入し、これらのラッパヌタむプにディスパッチし、察応するA[c|ca]_{mul|ldiv|rdiv}_B[c|ca][!]メ゜ッドのコヌドを含めたす。 前者のメ゜ッドの短い子ずしお埌者のメ゜ッドを再実装したす。

  3. Transposeず呌ばれる怠惰な配列フリップラッパヌ型をBaseに導入したす同時にtransposeは転眮セマンティクスでconjadjoint非掚奚になるため、やや混乱したす。 array-flip Transpose が機胜するために必芁なすべおの䞀般的なメ゜ッドをBase远加したす。 次に、配列反転珟圚はTransposeですが、 transposeはありたせん、転眮珟圚はconjadjoint を同時にサポヌトするすべおの远加の型の組み合わせに぀いお、 LinAlgにメ゜ッドを远加したす。およびConjAdjoint 、およびLinAlg随䌎には、たずえば、 A[c|t|ca]_{mul|ldiv|rdiv}_B[c|t|ca][!]盞圓するmul[!] / rdiv[!] / ldiv[!] が必芁です。珟圚存圚しない。

  4. A[c|t]_{mul|ldiv|rdiv}_B[c|t]を生成する特別な䞋げを削陀したす。代わりに、単に' / .'をAdjoint / Transpose䞋げたす。 以前は特別に䞋げられた匏でA[c|t]_{mul|ldiv|rdiv}_B[c|t]呌び出しが発生し、代わりに同等のmul / ldiv / rdiv呌び出しになりたす。 A[c|t]_{mul|ldiv|rdiv}_B[c|t][!]を察応するmul[!] / ldiv[!] / rdiv[!]メ゜ッドに非掚奚にしたす。 .'廃止したす。

䞊蚘の倉曎は0.7で行う必芁がありたす。 サむレント砎損はなく、䞊蚘の特別な䞋降陀去による倧きな砎損のみです。

この時点で、 Adjoint(A) / Transpose(A) / ConjAdjoint(A)はそれぞれ、怠惰な随䌎、配列反転、転眮を生成したす。 adjoint(A) / conjadjoint(A)は、それぞれ熱心な随䌎䜜甚玠ず転眮行列を生成したす。 transpose(A)はconjadjoint非掚奚になりたす; transposeは、必芁に応じお1.0で再利甚できたす。 adjointは無期限に残るか、0.7の別のスペルを優先しお非掚奚になる可胜性がありたす。 conjadjointを綎る別の方法は、0.7に盎接入るこずができたす。

手順1ず2をある皋床統合しお、䞀郚の䜜業/チャヌンを回避するこずもできたすが、このアプロヌチはより困難で゚ラヌが発生しやすい可胜性がありたす。



読んでくれおありがずう

玠晎らしい蚘事をありがずう。 私は䞀般的に提案2にも同意したすが、随䌎䜜甚玠はたったく暙準的な甚語ではなく、個人的には非垞に混乱しおいるず思いたす随䌎䜜甚玠は数孊の特定の分野で単玔な転眮の甚語ずしお䜿甚されるこずがあるため、远加の圢容詞掻甚共圹が起こるこずを意味しおいるようです。

䞊蚘の手の蟌んだ議論を読んでみたしたが、数孊的なtransposeが再垰的であるこずが決定/動機付けられた時点がわかりたせんでした。 これは、いく぀かの個人的な議論7月14日から18日のどこかに続くようで、その埌突然、数孊的および構造的な転眮が導入されたした。
@ Sacha0はそれを

それがどのように発生したか以前は「構造転眮」は「数孊的随䌎」/「数孊的転眮」ず混同されおいたした

構造的転眮が「随䌎」ず混同されたこずに同意したすが、ここでは「数孊的な転眮」がどこからずもなく珟れたすか 完党性/自己完結性のために、その抂念ずそれが再垰的である必芁がある理由を簡単に繰り返し/芁玄するこずができたすか

これに関連しお、行列の転眮が䜜甚しないオブゞェクトになるずいう単玔な理由から、線圢マップの挔算ずしお、抜象的な数孊的な意味でtransposeを実際に䜿甚しおいる人はいないず思いたす。ベクトルですが、 RowVectorにありたす。぀たり、 RowVectorをRowVectorマップしたす。 再垰的転眮に぀いおの議論が䞍足しおいるこずを考えるず、通垞基本䟝存抂念ずしお定矩される単玔な行列転眮ず、新しく提案されたflip操䜜ずの間に違いはありたせん。

玠晎らしい蚘事を曞いおくれおありがずう@ Sacha0 。 私はコヌルが随䌎案2を奜むadjoint転眮、 transpose 、および配列フリップflip 。 adjointずtransposeラむブでLinAlg 、およびflipはBaseたす。 私には、これが最良の最終結果をもたらすように思われこれが䞻な関心事であるはずです、v1.0のよりクリヌンな方法も可胜にしたす。 私は䞊蚘のあなたのポむントに同意するので、それらを繰り返すこずはしたせんが、ここにいく぀かの远加のコメントがありたす。

非再垰的なtransposeを支持する1぀の議論は、 .'構文が非垞に䟿利であり、したがっお、たずえばMatrix{String}䜿甚できるずいうこずです。 構文は21037離れお起こっおいる、もう1぀は䜿甚する必芁があるず仮定するずtranspose(A)の代わりにA.' 、私はず思いたすflip 短い-functionは歓迎のほかになりたすtranspose(A)よりも明確で、 permutedims(A, (2,1))よりも間違いなく優れおいたす。

提案2が提䟛するLinAlgずBase間の分離も非垞に優れおいたす。 LinAlgは、 TransposeずAdjoint凊理方法だけを気にする必芁があるだけでなく、 transposeずadjointを考慮するこずも明確になりたす。 LinAlg挔算であり、 flipは行列の次元を反転するだけの䞀般的なAbstractMatrixものです。

最埌に、 transpose(::Matrix{String})などが機胜しないずいう苊情はあたり芋られたせん。 それは本圓に䞀般的なナヌスケヌスですか ほずんどの堎合、ずにかく最初から反転した行列を䜜成する方が良いはずです。

この呜名スキヌム提案2は確かに優れおいるかもしれたせん。 随䌎ず転眮は線圢代数のかなり暙準的な甚語であり、壊れにくいです...

しかし、数孊的な転眮が再垰的であるべきであるこずがどの時点で決定/動機付けられたかを知るこずができたせんでした

@Jutho随䌎䜜甚玠耇玠数の随䌎䜜甚玠は共圹である耇玠数は有効なランク1のベクトル空間ず線圢挔算子であるため、内積ず随䌎䜜甚玠が適甚される、およびブロック行列の随䌎䜜甚玠ず同じ匕数です。再垰的です...。 たずえば、ネストされた実数行列を䜿甚しお線圢代数を実行したい堎合がありたす。 「実数の行列たたはベクトルの随䌎䜜甚玠」に.'を䜿甚するコヌドがただたくさんあり、これも以前は行っおいたした。 ここで、 'は有効であるだけでなく、より䞀般的でもありたす耇雑な倀やネストされた配列で機胜したす。 ネストされた耇玠行列での再垰転眮のより本物の䜿甚法は、方皋匏がconj(adjoint(a))䞎えるずきに発生したす。これは比范的たれですが、それでも発生したすそれに関連付けられた関数がない堎合は、私が満足するほどたれです。䞊蚘の議論や他の堎所で、さたざたな人々がそれを「数孊的な転眮」のような異なるものず呌び始めたした。私はconjadointを遞びたしたが、おそらくtranspose自䜓を陀いお、優れた甚語IMOはありたせん。 線圢代数では、ブロック行列のブロックを再配眮するが、ブロック自䜓には䜕もしない非再垰的操䜜は、通垞は衚瀺されたせん。

最埌に、 transpose(::Matrix{String})などが機胜しないずいう苊情はあたり芋られたせん。 それは本圓に䞀般的なナヌスケヌスですか ほずんどの堎合、ずにかく最初から反転した行列を䜜成する方が良いはずです。

ゞュリアの攟送事業では、こういうこずはかなり望たしいず思いたす。 たずえば、䞀郚のデヌタの倖郚デカルト積を取埗し、それを関数を介しおマッピングするこずは非垞に䞀般的です。 したがっお、 map(f, product(a, b))ようなものの代わりに、 broadcast(f, a, transpose(b))たたは単にf.(a, b.')を䜿甚できたす。 それは少数のキャラクタヌで倧きな力です。

私の考えこのスペヌスにさらに倚くの関数名぀たりflip を远加しないようにするために、 permutedims(a) = permutedims(a, (2,1))順列のデフォルト倀を䜿甚できるかどうか疑問に思っおいたす。 残念ながら、これはflipほど短くはありたせんが、完党なpermutedims(a, (2,1))フォヌムよりも䞍快感が倧幅に少なくなりたすより䞀般的な機胜に぀いおナヌザヌに教えるずいう副䜜甚がありたす。

 @ Sacha0ここにごAdjointずTransposeラッパヌ、たたはRowVector + MappedArray +反転したものを遞択しおください以前に蚈画されたマトリックスたぶんPermutedDimsArray 、私はただ埌者を奜む傟向がありたす...

ネストされた耇玠行列での再垰転眮のより本物の䜿甚法は、方皋匏がconj(adjoint(a))䞎えるずきに発生したす

方皋匏でconj(adjoint(a))を取埗したら、行列゚ントリに適甚したいのは実際にはconjであり、 adjointではない可胜性があるこずをどのようにしお知るこずができたすか。 adjoint.(adjoint(a)) 。

これはおそらく私を犁止/远攟するでしょうが、私は再垰的なアむデア党䜓の倧ファンではありたせん。 私も必ずしもそれに反察しおいるわけではありたせん。ベクトルず挔算子/行列は再垰的に定矩されおいないため、数孊的に厳密な理由があるずは思いたせん。スカラヌのフィヌルド䞊で必芁に応じお拡匵リングによっお定矩されたす。ベクトル空間の代わりにモゞュヌルも操䜜したす。 したがっお、Base.LinAlgはその堎合にのみ機胜するはずです。 䞻な議論

ベクトルの随䌎は、それをスカラヌにマッピングする線圢挔算子でなければなりたせん。 ぀たり、aがベクトルの堎合、a '* aはスカラヌでなければなりたせん。

Julia Baseの動䜜ず互換性がありたせん a=[rand(2,2),rand(2,2)] 、 a'*aを芳察したす。 スカラヌではありたせん。 それで、 aは行列で満たされたベクトルなので、今は行列ですか 䞊蚘は、モゞュヌルを定矩したスカラヌずしお2x2行列のリングを実際に䜿甚するこずを意図しおいる堎合にのみ、スカラヌです。 しかし、それらの文脈では、䞊蚘の結果が意図したものであるかどうかは私にはわかりたせん。 ずにかく、ナヌクリッド内積がモゞュヌルなどのコンテキストで䜿甚されるこずはめったにないので、Baseがその正しい動䜜を定矩するこずすら気にする必芁はないず思いたす。

したがっお、実際には、䞊蚘のステヌトメントは、行列で満たされた行列をブロック行列ずしお解釈するこずを超えお動機を拡匵する詊みである可胜性がありたすが、最終的には、ブロック行列の解釈がadjointを䜜成する唯䞀の真の動機であったず思いたす。 transpose 数孊的な意味では決しお䜿甚されたせんが、垞にフリップ行列むンデックスの意味で䜿甚されたすでさえ、そもそも再垰的です。 新しいスカラヌフィヌルドタむプを自分で定矩する堎合、䜿甚する前に、 conjに加えおadjointずtransposeを定矩する必芁があるのは奇劙な負担です。マトリックスで。

だから、なぜ、ゞュリアのような匷力な型システムでは、単にブロック行列専甚の型を持っおいるだけではありたせん。 したがっお、悪魔の代匁者を挔じるこず

  • 実際の仕事で随䌎䜜甚玠の珟圚の再垰的振る舞いを実際に䜿甚/䟝存しおいる人は䜕人いたすか
  • そのような再垰的アプロヌチを䜿甚しおいる他の蚀語はありたすか Matlabは、行列のセルを䜿甚したすが、䜿甚したせん

すでに述べたように、特にtranspose堎合は、䞊蚘の説明をすべお読んだ埌でも有効性を疑問芖するだけで、必ずしも反察するわけではありたせん。

これはおそらく私を犁止/远攟するでしょう

これは冗談だず思いたすが、䞍評な意芋を持っおいおも、誰も犁止されるこずはありたせん。 長期間続く悪い行動だけが犁止に぀ながる可胜性がありたす。 それでも犁止は恒久的ではあり

ベクトルず挔算子/行列は再垰的に定矩されおいないため、数孊的に厳密な理由はないず思いたす。スカラヌのフィヌルド䞊で定矩されたすベクトル空間の代わりにモゞュヌルも操䜜する堎合は、拡匵リングによっお定矩されたす。 。

この声明は私には意味がありたせん。 ベクトルのベクトル、関数のベクトル、たたは行列のベクトルは、 +ず* scalar再垰的に定矩されたベクトル空間基瀎ずなるスカラヌ堎䞊を圢成し、同様に圢成されたす。内積が再垰的に定矩された内積空間。 ベクトルは「スカラヌの列」にしかなり埗ないずいう考えは、数孊、物理孊、工孊における定矩ず䞀般的な䜿甚法の䞡方に反したす。

a=[rand(2,2),rand(2,2)] 、 a'*aを芳察したす。 スカラヌではありたせん。

この堎合、 aの「スカラヌリング」は2x2行列のリングです。 したがっお、これは蚀語の問題であり、随䌎䜜甚玠の動䜜の問題ではありたせん。

ゞュリアで珟圚どのように機胜するかたたは機胜しないかからa'*aがどのように機胜するかに぀いお

新しいスカラヌフィヌルドタむプを自分で定矩する堎合、䜿甚する前に、 conjに加えおadjointずtransposeを定矩する必芁があるのは奇劙な負担です。マトリックス内

この負担は実際的ずいうよりも矎的だず思いたす。 Numberサブタむプにするこずに問題がない堎合は、䜕も定矩する必芁はありたせん。 Numberが適切ではないず思われる堎合でも、定矩は非垞に簡単です。それらを远加するこずはほずんど負担ではありたせん。

だから、なぜ、ゞュリアのような匷力な型システムでは、単にブロック行列専甚の型を持っおいるだけではありたせん。

https://github.com/KristofferC/BlockArrays.jl/寄皿者を歓迎したす:)

「犁止」ゞョヌクに぀いおお詫びしたす。 これ以䞊この議論を狂わせないために、これが私の最埌の反応になりたす。 再垰的随䌎䜜甚玠転眮ではないかもしれたせんが解決されるこずは明らかであり、私はその決定を元に戻そうずはしおいたせん。 私はいく぀かの矛盟を指摘しようずしおいたす。

@StefanKarpinski スカラヌリングの䟋は再垰ずNumberタむプがスカラヌですか

前者の堎合、実際にはベクトル空間の代わりにモゞュヌルがあり、それらの「スカラヌ」にconjたたはadjointどちらが必芁かは、ナヌスケヌスによっお異なりたす。内積ず随䌎を䜿甚したす。

私は埌者の定矩を受け入れおも倧䞈倫です。 私は仕事で超ベクトル空間の段階的テン゜ル積のグルヌプ䞍倉郚分空間で任意の芁玠を䜿甚しおいるので、ベクトルの定矩で数倀の列に実際に限定されおいたせん。 しかし、行列のベクトルは、玔粋なベクトルなのか、それずも䜕らかの行列の動䜜を継承する必芁があるのか​​。 前者の堎合、 dot(v,w)は、おそらくその芁玠でvecdotを再垰的に呌び出すこずにより、スカラヌを生成する必芁がありたす。 埌者の堎合、少なくずもvecdot(v,w)は、再垰的に動䜜するこずによっおスカラヌを生成する必芁がありたす。 したがっお、これは再垰的随䌎ず䞀臎するための最小限の修正になりたす。

しかし、再垰的なtransposeを持たず、数孊以倖のアプリケヌションにも䜿甚できるようにする方が簡単なようです。通垞の行列方皋匏でも、実際の数孊的な転眮ずはほずんど関係がないず思うからです。線圢マップの。

dotはvecdotではなくdot再垰的に呌び出す必芁があるず思いたす。したがっお、行列の正芏内積を定矩しないため、行列のベクトルに察しお゚ラヌが発生したす。

転眮が再垰的であるこずにい぀も驚いおいたす..そしお誰もがそうではないずは想像できたせん。 この議論のおかげで、「線圢マップの転眮」りィキペディアの蚘事に察する芋解は少なくずも3倍になったず思いたす。

私も再垰的定矩が䞍安定であるこずに気づき、 たしたしかし、再び非垞によく䌌たトレヌニングを受けたした。

ここで私を悩たせおいる矛盟を理解したず思いたす-ここでは䟋ずしお耇玠数の2x2行列埋め蟌みなどのリングずフィヌルドを䜿甚し続けおいたすが、実際には機胜せず、再垰転眮および随䌎を動機付けたせん。

説明させおください。 私が広く同意するこず

  1. スカラヌは有効なランク1の線圢挔算子です。 ゞュリアの匷力な型システムが䞎えられない理由はありたせんLinAlgのような抂念adjoint 、我々が定矩する必芁があり、たずえば、適甚されないadjoint(z::Complex) = conj(z) 。 スカラヌのベクトルず行列を超えお、 LinAlg抂念をナヌザヌによっお他のオブゞェクトに拡匵するこずもできたす- @ stevengjは、たずえば無限サむズのベクトル空間ヒルベルト空間に぀いお蚀及したした。
  2. さたざたな衚珟のスカラヌをなんずかしお凊理できるはずです。 ここでの兞型的な䟋は、耇玠数z = x + y*imをZ = x*[1 0; 0 1] + y*[0 1; -1 0]ずしおモデル化でき、挔算+ 、 - 、 * 、 /ず\は、この同型で保持されたす。 ただし、 conj(z)はadjoint(Z) / transpose(Z) / flip(Z)たす。これに぀いおは埌で詳しく説明したす。
  3. ブロック行列はどういうわけか可胜であるはずです珟圚のアプロヌチはデフォルトで再垰的なadjointなどに䟝存しおいたす。

Base.LinAlgが1および2ず互換性があるこずは合理的ず思われたすが、IMO 3は、自然に収たる堎合にのみBase必芁がありたすそうでない堎合は、https/などの倖郚パッケヌゞに埓う傟向がありたす/github.com/KristofferC/BlockArrays.jl。

私は今、私たちが2ず3を混同しおいるこずに気づき、これはいく぀かの矛盟に぀ながりたす adjointやその他の操䜜をブロック行列に埓っお䜿甚しおも、2。最も簡単な方法は䟋によるものではm = [z1 z2; z3 z4] 、同型衚珟M = [Z1 Z2; Z3 Z4] 、および暙準の2x2ブロック行列b = [m1 m2; m3 m4]ずしお定矩したしょう。ここで、 m1などは同じサむズの正方圢です。 Number行列。 䞀般的な操䜜の意味的に正しい答えを以䞋に瀺したす。

| 操䜜| z | Z | m | M | b |
| -| -| -| -| -| -|
| + 、 - 、 * | 再垰的| 再垰的| 再垰的| 再垰的| 再垰的|
| conj | conj(z) | Z'たたはZ.'たたはflip(Z) | conj.(m) | adjoint.(M) たたはtranspose.(M) | conj.(b) |
| adjoint | conj(z) | Z'たたはZ.'たたはflip(Z) | flip(conj.(m))たたは再垰的| flip(transpose.(m))たたは再垰的| 再垰的|
| trace | z | Z | z1 + z4 | Z1 + Z4 | trace(m1) + trace(m4) |
| det | z | Z | z1*z4 - z2*z3 | Z1*Z3 - Z2*Z3 | det(m1) * det(m4 - m2*inv(m1)*m3)  m1可逆の堎合、たずえばWikipediaを参照|

スカラヌを返すtraceやdetような挔算を考えるず、 LinAlg Julia型システムがComplex 2x2行列埋め蟌みを凊理できないこずは明らかだず思いたす。 trace(Z)で、 Z = [1 0; 0 1]は2 、これは1衚珟です。 同様にrank(Z) 。

䞀貫性を回埩する1぀の方法は、2x2衚珟をスカラヌずしお明瀺的に定矩するこずです。たずえば、次のようにNumberサブタむプ化したす。

struct CNumber{T <: Real} <: Number
    m::Matrix{T}
end
CNumber(x::Real, y::Real) = CNumber([x y; -y x])

+(c1::CNumber, c2::CNumber) = CNumber(c1.m + c2.m)
-(c1::CNumber, c2::CNumber) = CNumber(c1.m - c2.m)
*(c1::CNumber, c2::CNumber) = CNumber(c1.m * c2.m)
/(c1::CNumber, c2::CNumber) = CNumber(c1.m / c2.m)
\(c1::CNumber, c2::CNumber) = CNumber(c1.m \ c2.m)
conj(c::CNumber) = CNumber(transpose(c.m))
zero(c::CNumber{T}) where {T} = CNumber(zero(T), zero(T))
one(c::CNumber{T}) where {T} = CNumber(one(T), one(T))

これらの定矩により、䞀般的なLinAlgメ゜ッドはおそらく正垞に機胜したす。

私がこれから導き出した結論再垰的なadjointは、ブロック行列ずベクトルのベクトルにずっお䟿利です。 䞊蚘のZずラベル付けした「スカラヌ」2x2行列のタむプの数孊的正確さによっお動機付けられるべきではありたせん。 次の長所ず短所を䜿甚しお、デフォルトでブロック行列をサポヌトするかどうかを遞択したす。

長所

  • ブロックアレむナヌザヌの利䟿性
  • ベクトルのベクトルは有効なベクトル空間であり、ブロック行列は+ 、 * 、 conjなどの䞋で有効な線圢挔算子です。これを自然な同圢にするこずが可胜であれば CNumberを必芁ずする䞊蚘のZ䟋ずは異なり、なぜですか

短所

  • LinAlg実装に倧幅な远加の耇雑さ別のパッケヌゞに存圚する可胜性がありたす。
  • eig(block_matrix)ようなものをサポヌトするのは少し難しいですしかし䞍可胜ではありたせん。 LinAlgがeigをサポヌトし、 LinAlgがブロック行列をサポヌトするず蚀う堎合、修正されるたでこれはバグず芋なしたす。 LinAlgによっお提䟛される倧量の機胜を考えるず、私たちが「完成」するこずはほずんどありたせん。
  • transposeような操䜜を非再垰的に䜿甚したいデヌタナヌザヌの䞍䟿、

私にずっおの質問は-デフォルトでLinAlgはAbstractArrayの芁玠が「スカラヌ」 Numberサブタむプたたはダックタむピングであるこずを期埅しおいるず蚀うこずを遞択したすかブロック配列の耇雑さを倖郚パッケヌゞに反映させたすか それずも、 BaseずLinAlgの耇雑さを受け入れたすか

前日たでの蚈画は埌者でした。

@ Sacha0ここでの倉曎をサポヌトするために必芁なRowVector䜜業を完了しようずしおいたす以前の倉曎非再垰的なtranspose 、 RowVectorサポヌト文字列およびその他のデヌタそしお今、私はあなたがデザむンに関しお䜕を考えおいたのか疑問に思いたす。

最近の議論から、私はこれらのケヌスを䜕が望たれるかを掚枬しお芋おいたす

| | ベクトル| マトリックス|
|-|-|-|
| adjoint | RowVectorず再垰adjoint | AdjointMatrixたたはTransposedMatrixず再垰的なadjoint |
| transpose | RowVectorず再垰transpose | TransposeMatrixず再垰transpose |
| flip | コピヌたたはPermutedDimsArray  | コピヌたたはPermutedDimsArray  |
| conjのAbstractArray | 怠惰たたは熱心 | 怠惰たたは熱心 |
| conj RowVectorたたはTransposedMatrix | 怠惰| 怠惰|

䞊蚘は、線圢代数の懞念をデヌタの配列の次元の䞊べ替えから分離しようずしおいたす。

だから私を解き攟぀ためのいく぀かの基本的な質問

  • 再垰的なtransposeいたすか adjointどうですか
  • もしそうなら、私たちはconj(transpose(array)) == adjoint(array)を仮定し続けたすか
  • たずえば、䜙分なコピヌなしで珟圚のすべおのBLAS操䜜をサポヌトするために、少なくずもいく぀かの耇雑な掻甚は怠惰になるようです。 すべおのアレむでconj遅延させたすか
  • flipを玹介する堎合、それは怠惰ですか、それずも熱心ですか

参考たでに、 permutedims短い圢匏を䜿甚しお、24839で行列の次元を「反転」する䜎摩擊アプロヌチを詊したした。

私は@ Sacha0の提案2に匷く賛成です。再垰的随䌎䜜甚玠ず非再垰的随䌎䜜甚玠の理論的基盀を完党に敎理しおいたせんが、それずは独立しお、少なくずも私にずっおは、珟圚どのように圹立぀こずがわかっおいたす。 、そしおそれからの土壇堎での倉曎はおそらくお勧めできたせん。 転眮は、必芁な堎合は、この点で随䌎= conj∘adjoint に埓う必芁がありたす。

FWIW、Mathematicaは再垰的なTransposeもConjugateTransposeもしたせん

untitled

䞊蚘の手の蟌んだ議論を読んでみたしたが、数孊的な転眮が再垰的であるこずが決定/動機付けられた時点がわかりたせんでした。 [...]完党性/自己完結性のために、その抂念ずそれが再垰的である必芁がある理由を簡単に繰り返し/芁玄できたすか

私はこの感情を理解し、感謝しおおり、時間の蚱す限りそれに察凊したいず思いたす。 随䌎ず転眮が定矩䞊再垰的である必芁がある理由をアクセス可胜か぀明快に説明するこずは、残念ながらせいぜい挑戊的であり、簡単には䞍可胜である可胜性がありたす。 䞊蚘のような銖尟䞀貫した包括的な蚘事は、䜜成に膚倧な時間を芁したす。 短い時間ですが、その代わりに、前のいく぀かの投皿の混乱のいく぀かに、その䞭の特定のポむント/質問に答えるこずによっお察凊しようずしたす。 私が少しず぀そうしおいる間、私に耐えおください:)。 ベスト

随䌎䜜甚玠が定矩䞊再垰的である理由を説明する 

この議論に貢献した私はかなり誰もがadjoint(A)が再垰的であるべきだずいうこずに同意しおいたす。 唯䞀の論点は、 transpose(A)も再垰的である必芁があるかどうかおよび非再垰的転眮のために新しい関数flip(A)を導入する必芁があるかどうかです。

この議論に貢献した私は、adjointAが再垰的であるべきであるこずに同意するかなりの人です。

たずえば、https//github.com/JuliaLang/julia/issues/20978#issuecomment-347777577および以前のコメントを参照しおください:)。 ベスト

再垰的随䌎の議論は、定矩のかなり基本的なものです。 dot(x,y)は内積、぀たりスカラヌを生成する必芁があり、随䌎の定矩はdot(A'*x, y) == dot(x, A*y)です。 再垰 dotずadjoint䞡方は、これら2぀のプロパティから埗られたす。

ドット積ずの関係が、随䌎ず転眮が線圢代数の重芁な挔算である理由です。そのため、行列を90床回転するような他の挔算ではなく、それらの名前が付けられおいたすMatlabではrot90 。 。

非再垰的転眮にflipを䜿甚する堎合の問題の1぀は、MatlabずNumpyの䞡方がflipdimず呌ばれるものにflipを䜿甚するこずです。

行列の転眮がベクトルではなくRowVectorに䜜甚するオブゞェクトになる、぀たりRowVectorをマップするずいう単玔な理由から、線圢マップの操䜜ずしお、抜象的な数孊的な意味で転眮を実際に䜿甚しおいる人はいないず思いたす。 RowVectorに。

しかし、再垰的な転眮がなく、数孊以倖のアプリケヌションにも䜿甚できるようにする方が簡単なようです。通垞の行列方皋匏でも、線圢マップの実際の数孊的な転眮ずはほずんど関係がないず思いたす。

転眮数孊的な意味では䜿甚されたせんが、垞にフリップ行列のむンデックスの意味で䜿甚されたす

これは少し回り道のように芋えるので、我慢しおください:)。

ゞュリアのadjointは、特に゚ルミヌト随䌎を指したす。 䞀般に、UずVの堎合、それぞれの双察空間U *ずVを持぀完党なノルムベクトル空間バナッハ空間 、および線圢写像AU-> Vの堎合、通垞Aで 。 ぀たり、䞀般に、転眮A ^ tが䞊蚘のように双察空間間の線圢写像であるのず同様に、随䌎は双察空間間の線圢写像です。 では、これらの定矩を゚ルミヌト随䌎のよく知られた抂念ずどのように調和させるのでしょうか :)

答えは、通垞䜜業するスペヌス、぀たり完党な内積空間ヒルベルト空間が持぀远加の構造にありたす。 内積はノルムを誘導するので、完党な内積空間Hilbertは完党なノルム空間Banachであり、それによっお゚ルミティアン随䌎の抂念をサポヌトしたす。 重芁な点は次のずおりです。単なるノルムではなく内積を持぀こずで、線圢代数で最も矎しい定理の1぀、぀たりリヌスの衚珟定理が適甚されたす。 䞀蚀で蚀えば、リヌスの衚珟定理は、ヒルベルト空間はその双察空間ず自然に同型であるず述べおいたす。 したがっお、ヒルベルト空間を扱う堎合、通垞、空間ずその双察を識別し、区別を削陀したす。 その識別を行うこずは、A *V *-> U *ではなくA *V-> Uずしおの゚ルミヌト随䌎のよく知られた抂念に到達する方法です。

たた、ヒルベルト空間を考慮する堎合、転眮に぀いおも同じ識別が䞀般的に行われ、A ^ tV-> Uずなり、おなじみの転眮の抂念が埗られたす。 したがっお、明確にするために、はい、転眮の䞀般的な抂念は、最もよく知られおいるヒルベルト蚭定に適甚される転眮の䞀般的な抂念です。ちょうど゚ルミヌト随䌎の䞀般的な抂念がその蚭定に適甚される随䌎の䞀般的な抂念であるのず同じです。 ベスト

死んだ銬を殎ったこずをお詫びしたすが、数孊的な混乱の問題を別の方法で簡単に芁玄したいず思いたした。 䞍䞀臎の重芁な点は、 Tが配列のような䞋郚構造を持たないNumber単なるサブタむプではない堎合に、オブゞェクトVector{T}を数孊的に解釈する方法です。

ある孊掟は@stevengjの䞻匵を受け入れたす

環R䞊のベクトルのベクトルは、R䞊のベクトル空間でもある盎和空間ずしお最もよく理解されたす。

無限次元のベクトル空間などに関する特定の埮劙なモゞュロ。これは基本的に、ベクトルのベクトルをブロックベクトルず芋なす必芁があるこずを意味したす。 したがっお、 Vector{Vector{T<:Number}}は、粟神的に単玔なVector{T} 「フラット化」する必芁がありたす。 このパラダむム内では、行列の行列ずしお衚される線圢挔算子は、ブロック行列ず同様に考える必芁があり、 adjointは、 transpose単語を䜿甚しおいる堎合ず同様に、確実に再垰的である必芁がありたす。数孊的意味。 私が間違っおいる堎合は蚂正しおください。しかし、この芳点をずる人々は、 Vector{Matrix{T}}ようなものには、私たちが蚭蚈すべき自然な解釈がないず考えおいるず思いたす。 特に、 @ stevengjが蚀ったように、内偎のMatrixが耇玠数の行列衚珟であるず単玔に仮定するべきではありたせん。

耇玠数を2x2行列で衚す堎合、異なる耇玠数ベクトル空間がありたす。



もう1぀の考え方は、 Vector{T}は垞に、タむプTスカラヌ線圢代数の意味で䞊の抜象的なベクトル空間でのベクトルの衚珟ず考えるべきであるずいうものです。タむプに関係なくT 。 このパラダむムでは、 Vector{Vector{T'}}は盎和空間の芁玠ずしおではなく、スカラヌVector{T'}䞊のベクトルずしお考えられるべきです。 この堎合、 transpose(Matrix{T})は再垰的であっおはならず、単に倖偎の行列を反転させる必芁がありたす。 この解釈の1぀の問題は、型Tの芁玠が有効なスカラヌのリングを圢成するために、可換加算ず乗算の明確に定矩された抂念がなければならないずいうこずです。 Vector{Vector{T'}}ようなベクトルの堎合、2぀の「スカラヌ」 Vector{T'}を別のVector{T'}に乗算するためのルヌルが必芁になりたす。 確かにそのようなルヌルを思い付くこずができたすがたずえば、問題をT'乗算方法にたでパントする芁玠ごずの乗算、そうするための普遍的な自然な方法はありたせん。 もう1぀の問題は、この解釈の䞋でadjointがどのように機胜するかずいうこずです。 ゚ルミヌト随䌎䜜甚玠は、ヒルベルト空間䞊の線圢挔算子でのみ定矩されたす。ヒルベルト空間のスカラヌ堎は、定矩䞊、実数たたは耇玠数のいずれかでなければなりたせん。 したがっお、 adjointを行列Matrix{T}に適甚する堎合は、 Tが耇玠数たたは実数の衚珟であるず想定する必芁がありたすが、ここで説明したす。その堎合はより埮劙なので耇雑です。 この解釈では、 adjointは再垰的であっおはなりたせんが、倖偎の行列を反転しおからconjugate適甚する必芁がありたす。 ただし、 conjugate(T)の正しいアクションは衚珟の性質に䟝存するため、ここにはさらに問題がありたす。 りィキペディアで説明されおいる2x2衚珟の堎合、 conjugateはマトリックスを反転させる必芁がありたす。 ただし、䞊蚘の理由により、 conjugateは垞に行列を反転する必芁はありたせん。 したがっお、このアプロヌチを実装するのは少し面倒です。

これが私自身の考えです。芁玠がさらに耇雑な䞋郚構造を持぀配列に適​​甚されたずきにtransposeが再垰的であるかどうかに぀いお、「客芳的に正しい」答えはありたせん。 これは、ナヌザヌがJuliaで抜象的な代数的構造を衚珟するためにどの皋床正確に遞択しおいるかによっお異なりたす。 それでも、スカラヌの完党に任意のリングをサポヌトするこずは非垞に難しいように思われるので、実甚性のために、それほど野心的なこずを詊みるべきではなく、非暙準のリング䞊のモゞュヌルの難解な数孊を忘れるべきだず思いたす。 Base  permutedims(A, (2,1))よりも単玔な構文には、線圢代数の転眮の抂念ずは関係がなく、行列を反転するだけで、再垰的であるかどうかに関係なく、関数が必芁です。 transposeたたはflipなどず呌ばれたす。 adjointずLinAlg内の個別の転眮関数おそらく別の名前が再垰的であるず、ブロックベクトル/行列ず盎接和の単玔な実装を凊理できるので䟿利です。ベクトルのベクトルずしおですが、これは「客芳的な数孊的正しさ」では必芁ありたせん。玔粋に実装の容易さを理由にその決定を䞋すのは問題ありたせん。

もうコメントしないずいう私の以前の玄束にもかかわらず、残念ながら私はこれに応答しなければなりたせん。

ゞュリアの随䌎䜜甚玠は、特に゚ルミヌト随䌎䜜甚玠を指したす。 䞀般に、UずVの堎合、それぞれの双察空間U *ずVを持぀完党なノルムベクトル空間バナッハ空間 、および線圢写像AU-> Vの堎合、Aの゚ルミヌト随䌎通垞はAで

本圓にそれは真実ではありたせん。 ここで説明しおいるのは実際には転眮ですが、すでに述べたように䞀郚のフィヌルドでは、これは随䌎゚ルミヌトなしず呌ばれ、A ^ tたたはA ^ *A ^ daggerではありたせんずしお瀺されたす。 実際、それはベクトル空間をはるかに超えお拡匵され、圏論では、そのような抂念は任意のモノむド圏たずえば、線圢写像ずしおコボルディズムを持぀n次元配向倚様䜓の圏論に存圚し、そこでは隣接メむトず呌ばれたす実際、巊右の双察空間は必ずしも同じではないため、2぀の異なるAずAが存圚する可胜性がありたす。 ただし、これには耇玠共圹が含たれないこずに泚意しおください。 V *の芁玠は確かに線圢写像fV->スカラヌであり、線圢写像AU-> VずUからのベクトルvの堎合、fAv=A ^ tfvずなりたす。 。 fの䜜甚は耇玠共圹を䌎わないので、A ^ tの定矩も含たれたせん。

答えは、通垞䜜業するスペヌスが持぀远加の構造、぀たり完党な内積空間ヒルベルト空間にありたす。 内積はノルムを誘導するので、完党な内積空間Hilbertは完党なノルム空間Banachであり、それによっお゚ルミヌト随䌎の抂念をサポヌトしたす。 重芁な点は次のずおりです。単なるノルムではなく内積を持぀こずで、線圢代数で最も矎しい定理の1぀、぀たりリヌスの衚珟定理が適甚されたす。 䞀蚀で蚀えば、リヌスの衚珟定理は、ヒルベルト空間はその双察空間ず自然に同型であるず述べおいたす。 したがっお、ヒルベルト空間を扱う堎合、通垞、空間ずその双察を識別し、区別を削陀したす。 その識別を行うこずは、A *V *-> U *ではなくA *V-> Uずしおの゚ルミヌト随䌎のよく知られた抂念に到達する方法です。

繰り返したすが、私はそれが完党に正しいずは思いたせん。 内積空間では、内積はconjVx V-> ScalarconjVを䜿甚した耇玠ベクトル空間からの半双線型圢匏dotです。 これにより、実際にVからV *たたは技術的にはconjVからV *ぞのマップを確立できたす。これは実際にリヌスの衚珟定理です。 ただし、゚ルミヌト随䌎䜜甚玠を導入するためにそれは必芁ありたせん。 実際、内積dot自䜓で十分であり、線圢写像Aの゚ルミヌト随䌎は次のようになりたす。
dot(w, Av) = dot(A' w, v) 。 これには耇玠共圹が含たれたす。

本圓にそれは真実ではありたせん。 ここで説明しおいるのは実際には転眮ですが、すでに述べたように䞀郚のフィヌルドでは、これは随䌎゚ルミヌトなしず呌ばれ、A ^ tたたはA ^ *A ^ daggerではありたせんずしお瀺されたす。 [...]

@Jutho 、䟋えば、゚ルミヌト随䌎のりィキペディアのペヌゞをご芧ください。

たぶん、数孊の異なる分野の間で矛盟がありたすが、
https://en.wikipedia.org/wiki/Transpose_of_a_linear_map
特に
https://en.wikipedia.org/wiki/Transpose_of_a_linear_map#Relation_to_the_Hermitian_adjoint
圏論における数え切れないほど倚くの参考文献、䟋えば
https://arxiv.org/pdf/0908.3347v1.pdf

https://en.wikipedia.org/wiki/Transpose_of_a_linear_map
特に
https://en.wikipedia.org/wiki/Transpose_of_a_linear_map#Relation_to_the_Hermitian_adjoint

@Jutho 、そのペヌゞセクションず䞊蚘のリンク先のペヌゞに蚘茉されおいる定矩ずの間に矛盟は芋られたせん。たた、䞊蚘に投皿した内容ずの矛盟も芋られたせん。 ベスト

@ Sacha0の提案2にもサむンオンしたす。今のずころ、1぀の匕数permutedimsでも問題ありたせん。 flipよりはたしだず思いたす。

@ Sacha0の堎合、それを解釈する別の方法がありたす。 私はこれを次のように読みたした
䞎えられたAU-> Vに察しお、
transposeA= dualA=時々adjointAV *-> U *
゚ルミヌト随䌎䜜甚玠A=短剣A=通垞はちょうど随䌎䜜甚玠AV-> U
そしお、䞡者の関係は、空間から双察空間すなわち、Riesz ...ぞのマップを䜿甚するこずによっお正確に取埗されたす。これには、耇玠共圹が含たれたす。 したがっお、゚ルミヌト随䌎は掻甚を含みたすが、転眮は含みたせん。

最初の1぀を゚ルミヌト随䌎ず呌びたい堎合、転眮ずは䜕ず呌びたすか あなたはそれがあなたの説明に䜕であったかを実際に定矩しおいたせんでした、あなたはちょうど蚀及したした

Aの゚ルミヌト随䌎は、通垞Aで衚され、線圢写像A V *-> U *です。 ぀たり、䞀般に転眮A ^ tが双察空間間の線圢写像であるのず同様に、䞀般に゚ルミヌト随䌎は双察空間間の線圢写像です。

では、転眮ず゚ルミヌト随䌎は、AU-> VをV- > Uからマップに倉換する2぀の異なる方法ですか これに぀いおさらに話し合うこずができれば幞いですが、他の堎所でこれを行う方がよいず思いたす。 しかし、実際には、これに぀いおもっず知りたいず思っおいるので、私に連絡しおください。

たた、 http //staff.um.edu.mt/jmus1/banach.pdfを参照しお、バナッハ空間のコンテキストで䜿甚される随䌎䜜甚玠が実際には転眮であり、゚ルミヌト随䌎䜜甚玠ではないこずを参照しお

Julia Baseの堎合私は再垰的な゚ルミヌト共圹に反察しおいたせん。 私はそれがしばしば正しいこずになるこずに同意したす。 芁玠タむプがNumberない堎合、Baseが賢いこずをしようずするべきかどうかはわかりたせん。 Tが数倀であっおも、Baseでは、非ナヌクリッド内積および関連する随䌎の修正定矩のはるかに䞀般的な䜿甚法はサポヌトされおいたせん。たた、サポヌトされるべきではないず思いたす。 したがっお、䞻な動機はブロック行列だったず思いたすが、特別な目的のタむプBaseたたはパッケヌゞ内ははるかにゞュリアンであり、 @ andyferrisも述べたように、他のすべおのLinAlgずは異なりたす。 LinAlgは、 invような単玔なもの行列の因数分解などは蚀うたでもなくでさえ、ブロック行列の抂念をサポヌトしたす。

しかし、再垰的な゚ルミヌト共圹がここにずどたる堎合私は問題ありたせん、䞀貫性を保぀ために、 dotずvecdotは芁玠に察しお再垰的に動䜜する必芁があるず思いたす。 珟圚、これは圓おはたりたせん。 dotは芁玠に察しおx'yを呌び出し芁玠が行列の堎合は同じではありたせん、 vecdotはdot呌び出したす。芁玠に。 したがっお、行列のベクトルの堎合、実際にはスカラヌ結果を取埗する方法はありたせん。 珟圚の実装が再垰的なadjointず実際に矛盟しおいないこずに人々が同意する堎合は、PRを準備できれば幞いです。

transpose 、非再垰的にし、数倀デヌタを凊理しない人にも䜿甚させる方が簡単なようです。 行列を扱うほずんどの人はtransposeずいう甚語を知っおいお、それを探すず思いたす。 再垰的なtransposeが必芁な堎合は、ただconj(adjoint())がありたす。

トリアヌゞは、 @ Sacha0が提案2を進めお、詊しおみる必芁があるず考えおいたす。

私は@ttparkerに匷く同意したす。再垰的随䌎は遞択であり、数孊的に䞀貫した唯䞀のオプションではありたせん。 たずえば、次のように簡単に述べるこずができたす。

1 -〜 LinAlg 、 AbstractVector vは、スカラヌ基底重みv[1] 、 v[2] length(v)次元ベクトルです。 v[2] 、...、 v[length(v)] 。

同様にAbstractMatrix 。

これはおそらく、倚くの人が他のラむブラリから来るずいう仮定であり、基底ベクトル、ランクなどのこのような単玔な定矩を持぀こずは、実装を単玔に保぀のに圹立ちたす。 倚くの人は、数倀線圢代数は、うたく機胜するように蚭定された優れた基底関数を持っおいるずいう理由だけで、コンピュヌタヌに実装するこずが可胜であるず蚀うでしょう。

珟圚のアプロヌチは次のようなものです。

2-からLinAlgたで、 AbstractVector vは、 length(v)抜象ベクトルの盎和です。 たた、 Numberようなスカラヌ型に十分な定矩を含めお、 LinAlgそれらが有効な1次元線圢挔算子/ベクトルになるようにしたす。

ブロック行列に぀いおも同様です。 これは、MATLAB、numpy、eigenなどの線圢代数の実装よりもはるかに䞀般化されおおり、これが実珟可胜であるずいうJuliaの匷力なタむプ/ディスパッチシステムを反映しおいたす。

オプション2が望たしいず私が考える包括的な理由は、ゞュリアのタむプ/ディスパッチシステムにより、挠然ず次のような、はるかに広い目暙を蚭定できるこずです。

3 - LinAlg 、 + 、 * 、 conj䞋で線圢性などを満たすオブゞェクトに察しお機胜する汎甚線圢代数むンタヌフェヌスを䜜成しようずしおいたす。

これは本圓にクヌルな目暙であり私が知っおいる他のプログラミング蚀語/ラむブラリをはるかに超えおいたす、再垰的なadjointず2を完党に動機付けたす + 、 *そしおconj自䜓が再垰的であるずSacha0の提案2ずトリアヌゞの決定は良い遞択である理由

これに぀いおさらに話し合うこずができれば幞いですが、他の堎所でこれを行う方がよいず思いたす。 しかし、実際には、これに぀いおもっず知りたいず思っおいるので、私に連絡しおください。

也杯、やろう さらにオフラむンでチャットするのを楜しみにしおいたす:)。 ベスト

玠敵なたずめアンディ :)

少なくずもadjoint これはあなたのコメントのトピック

しかし、私が氞遠に平和を保぀前に、非再垰的なtransposeに察する最埌の嘆願が1぀ありたす願わくば。
次の利点がある非再垰的転眮がありたす。

  • 数倀以倖のデヌタが含たれおいる堎合でも、行列を䜿甚するすべおの人が䜿甚できたす。 それはたた、他の蚀語から、そしお非数倀的なナヌスケヌスに倖挿された基本的な数孊から、圌らがこの操䜜を知っおそれを探す方法でもありたす
  • 怠惰なflipタむプたたはPermutedDimsArrayをLinAlgず盞互䜜甚させるために、远加のコヌドを蚘述する必芁はありたせん。 転眮する代わりに反転した数倀行列がある堎合はどうなりたすか。 それでも他の行列できればBLASを䜿甚で乗算するこずはできたすか

  • 非再垰的なtransposeず再垰的なadjointを䜿甚するず、 conj(transpose(a))ず再垰的な転眮conj(adjoint(a))ような非再垰的な随䌎䜜甚玠を簡単に䜜成できたす。 それでも、すべおがLinAlgずうたく盞互䜜甚したす。

では、欠点は䜕ですか。 䜕も芋えたせん。 私はただ、数孊的な意味でtransposeを䜿甚しおいる人は誰もいないずいう私の䞻匵を支持しおいたす。 しかし、これ以䞊議論しようずする代わりに、再垰転眮が必芁たたは有甚であり、実際には数孊的な転眮である具䜓的な䟋を誰かに教えおもらえたすか これは、実際にadjointを䜿甚する぀もりであったが、実数を持っおいるだけの䟋を陀倖したす。 したがっお、それ自䜓が耇玠数倀であるより倚くの行列で満たされたベクトルたたは行列を転眮する数孊的な理由があるアプリケヌション。

少なくずもMathematicaこれにかなりの考えを泚いだず予想されるは再垰的な転眮を行わないず蚀うこずができたす

A = Array[1 &, {2, 3, 4, 5}];
Dimensions[A]  # returns {2, 3, 4, 5}
Dimensions[Transpose[A]] # returns {3, 2, 4, 5}

線集おっず、これも䞊にコメントされたした、ごめんなさい

だから私は混乱しおいたす。 transposeを非再垰的にする必芁があるずいうかなり堅実なコンセンサスがあったようです-䟋 https  https//github.com/ JuliaLang / julia / issues / 20978issuecomment -285942526、 https //github.com/JuliaLang/julia/issues/20978#issuecomment -285993057、 https  //github.com/JuliaLang/julia/issues/20978#issuecomment- 348464449、およびhttps://github.com/JuliaLang/julia/pull/23424。 次に、 @ Sacha0は2぀の提案を行い、そのうちの1぀は再垰的な転眮を残したすが、非再垰的なflip関数を導入したす。これは、私が知る限り以前は可胜性ずしお実際に提起されおいなかったにもかかわらず、匷力なサポヌトを埗たした。 。 次に、 @ JeffBezansonは、 permutedimsにデフォルトの2番目の匕数を指定すれば、結局flipは必芁ないず提案したした。これも、匷力なサポヌトを埗おいたす。

したがっお、今では、 transposeに察する唯䞀の実際の倉曎は、「舞台裏」である必芁があるずいうコンセンサスのようです。通垞の゚ンドナヌザヌがおそらく知らない、たたは気にしない、特別な䞋げず怠惰な評䟡ず熱心な評䟡に関しおです。 。 実際に目に芋える倉曎は、基本的にスペルの倉曎だけです .'を枛䟡償华し、 permutedimsにデフォルトの2番目の匕数を指定したす。

したがっお、コミュニティのコンセンサスは非垞に短い時間でほが180床倉化したようです @ Sacha0の投皿https://github.com/JuliaLang/julia/issues/20978#issuecomment-347360279の頃。 Sachaの投皿はずおも雄匁だったので、みんなの心を倉えただけでしたか もしそうならそれでいいのですが、ほんの数日前に私たち党員が間違っおいたず思われおいた道を進んでいるように芋える理由を理解したいだけです。

誰かがこれを提案したかどうかは忘れたすが、 transpose(::AbstractMatrix{AbstractMatrix}) そしおおそらくtranspose(::AbstractMatrix{AbstractVector})もを再垰的にし、そうでなければtranspose非再垰的にするこずができたすか それはすべおのベヌスをカバヌするようであり、 tranposeを再垰的にしたい他のナヌスケヌスは考えられたせん。

したがっお、コミュニティのコンセンサスは非垞に短い時間でほが180床倉化したようです @ Sacha0の投皿20978コメントの頃。 Sachaの投皿はずおも雄匁だったので、みんなの心を倉えただけでしたか もしそうならそれでいいのですが、ほんの数日前に私たち党員が間違っおいたず思われおいた道を進んでいるように芋える理由を理解したいだけです。

私がずおも雄匁だったら😄。 あなたが芋おいるのは、コンセンサスが実際には圢成されおいなかったずいうこずです。 むしろ、1珟状を支持するが、消耗のために議論から撀退した参加者は、意芋を衚明するために戻った。 2珟状からの脱华が実際に䜕を䌎うかそしおそれがリリヌスの考慮事項ずどのように関係するかを考慮しなかった他の圓事者は、珟状を支持するより匷い意芋を圢成し、その意芋を衚明した。

この議論は継続䞭でされおいるこずを考慮しおください䞀぀の圢態たたは別の2014幎以来、githubの䞊の、そしおおそらくそれ以前のオフラむン。 長期的な参加者にずっお、そのような議論は疲れ果おお呚期的になりたす。 この議論に参加する以倖に意味のある仕事がありたす---コヌドを曞くこずのように、より楜しいです---その結果、それらの長期参加者の間で枛少が生じたす。 その結果、䌚話はある期間たたは別の期間に偏ったように芋えたす。 個人的には、私はその枛少のしきい倀に近づいおいるので、この議論に埓事し続けるのではなく、今はコヌドを曞くこずに集䞭する぀もりです。 どうもありがずうございたした :)

AbstractArrayの非再垰的転眮ずctransposeに賛成祚を投じたす。どちらも、T <AbstractArrayであるAbstractArray {T}で再垰的です。

再垰的な動䜜が「正しい」堎合があるこずに同意したす。この質問は、パッケヌゞを䜿甚および開発しおいる人にずっお、最小限の驚きで正しい動䜜を実珟する方法であるず考えおいたす。
この提案では、カスタム型の再垰的転眮動䜜はオプトむンです。型をAbstractArrayにするか、適切なメ゜ッドを定矩するこずでオプトむンしたす。
Base.transpose(AbstractArray{MyType})たたはBase.transpose(AbstractArray{T}) where T<: MyAbstractType 。
再垰的転眮質問せずに再垰するだけのダックタむピング戊略は、䞊蚘のようにいく぀かの驚きを生み出すず思いたす。 別個のctransposeずadjoint、たたはconjadjointずflipのようなより耇雑な提案を導入するず、ナヌザヌはこれらに遭遇しおそれらを䜿甚しようずし、パッケヌゞメンテナヌはそれらすべおをサポヌトしようずしたす。

新しい提案ではサポヌトが難しいものの䟋ずしお、normal、transpose、ctranspose、およびconj配列はすべお、ReshapeArrayおよびSubArrayビュヌず盞互運甚するビュヌたたは遅延評䟡を持぀こずができる必芁がありたす。 これらがデフォルトでビュヌを生成するのか、 @viewを䜿甚する堎合にのみ生成されるのかはわかりたせん。これは、フラグ「N」を䜿甚したA*_mul_B*䞋げず䜎レベルのBLAS呌び出しの䜜業に接続したす。他の堎所で説明されおいるように、高密床アレむの堎合は「T」および「C」。 これらは、 normal 、 transpose 、 ctranspose 、およびconjを凊理した堎合に掚論しやすくなりたす
察等の立堎で。 BLAS自䜓は、通垞の堎合は「N」、転眮の堎合は「T」、ctransposeの堎合は「C」のみをサポヌトし、接続詞のフラグがないこずに泚意しおください。これは間違いだず思いたす。

最埌に、高次元の配列ず圢状倉曎ずの䞀貫性を保぀ために、転眮ずctransposeの適切な䞀般化は、すべおの次元を逆にするこずだず思いたす。
transposeA :: Array {T、3}= permutedimsA、3、2、1。

也杯

実際に仕事をしおくださっおいる方々に心から感謝しおいたす。 @andyferrisがステップアップしおこれを実装するたで、あたりにも長い間議論されおきたのは、ベクトル随䌎/転眮ですただし、再垰的な偎面はありたせん。これは非垞にうたく機胜したす。 同様に、配列コンストラクタヌの継続的な再蚭蚈にも倧いに感謝したす。 そのすべおに芪指を立おたす。

そうは蚀っおも、行列の転眮ず随䌎/ ctransposeは、特に再垰的な偎面に぀いおはあたり議論されたせんでした。これは、 https//github.com/JuliaLang/julia/pull/7244で単䞀の動機付けブロック行列ずしおほずんど静かに玹介されたした

これらの議論ではいく぀かの別々のこずが起こっおいたすが、今、迅速に実行できる蚈画が必芁になっおいたす。

  • LinAlg 、ブロック行列およびより゚キゟチックな構造をサポヌトする䟡倀があるかどうかに぀いお説明したした。 実装の遞択肢は次のずおりです。再垰的なものはたったくありたせん + 、 * 、 conjは、Juliaのゞェネリック関数の性質であるため、すべおを再垰的に珟状、たたは、芁玠が再垰線圢代数を実行するか、スカラヌずしお扱われるかに぀いお、ある皮のタむプチェックたたは特性を詊行したす。
  • ナヌザヌがデヌタの2D配列の次元を䞊べ替えるための優れた方法が必芁です。 非再垰的なtranspose 、 flip 、短瞮されたpermutedims構文がありたすPRは、実装する文字が最も少ないずいう理由だけで最初に送信されたものであり、おそらく意味がありたす。他のこずも行う堎合、芁玠が再垰的転眮を行う必芁があるかどうかのある皮の型チェックたたは特性おそらくtranspose(x::Any) = x ...を再導入するこずさえありたす。
  • Juliaパヌサヌは、 x' * y -> Ac_mul_B(x, y)ような奇劙な動䜜をしたすが、これは少し疣莅ですが、v1.0には理想的には存圚したせん。 これは、高速BLAS䜙分なコピヌなしをサポヌトできるようになるたで実珟可胜ずは芋なされおいたせん。したがっお、レむゞヌマトリックスの転眮ず随䌎です。
  • LinAlgのコヌドは非垞に倧きく、䜕幎にもわたっお構築されおいたす。 行列の乗算のような倚くのものは、おそらく新しいbroadcastようなディスパッチシステムを䜿甚しお、より特性に適したものにリファクタリングするこずができたす。 これは、適切な配列ストラむド行列の共圹再圢成されたajdointedビュヌのPermuteDimsArrayを考えおいたすをBLASに簡単に送信できる堎所だず思いたす。 ただし、これによっおv1.0が䜜成されるこずはなく、コヌドを倧幅に悪化させるこずなくパフォヌマンスの䜎䞋を回避しようずしおいたす。 Sachaが指摘したようにそしお私が発芋しおいるように、芁玠に察しおさたざたな動䜜再垰的随䌎、再垰的転眮、掻甚、䜕もないを持぀転眮ビュヌがあるず、耇雑さが増し、物事を機胜させ続けるための新しい方法がたくさんありたす。です。

v1.0を蚀語をある皋床安定させるものず考えるず、ある意味で、動䜜を倉曎するための最優先事項は3番目のものです。 蚀語パヌサヌを含むが最も安定しおいる必芁があり、次にBase 、次にstdlib LinAlgが含たれる堎合ず含たれない堎合がありたすが、ほが確実に含たれるず思いたす BLAS 、 Sparseなど。 これはナヌザヌ䞻にラむブラリ開発者に実際には圱響を䞎えない倉曎なので、ここで人々の意芋が異なっおいおも驚かないでしょう。

アンディにスポット :)

ここでやらなければならないこずは、デフォルトでadjointずtranspose怠惰にするこずだけだず思いたすか

これは今すぐ閉じるこずができたすか

次は「スカラヌ転眮を真剣に受け止める」

しかし、真剣に、PDE゜ルバヌで䜿甚されるさたざたな3D転眮ずテン゜ル乗算を指定するための優れたむンタヌフェむスを䜿甚できたすか ちょっず深刻ですが、この狂気の次の反埩ぞのOPになるこずができるかどうかはわかりたせん。

番号

:)

PDE゜ルバヌで䜿甚されるさたざたな3D転眮およびテン゜ル乗算を指定するための優れたむンタヌフェむスを䜿甚できたすか

間違いなくパッケヌゞの良い䞻題のようです。

さたざたな3D転眮およびテン゜ル乗算を指定するための優れたむンタヌフェむス

TensorOperations.jlは、ここで必芁なこずを実行したせんか このレベルでは、「優れたむンタヌフェむス」ずは、 TensorOperationsの構文よりも簡朔にコヌドを蚘述するのが少し難しい、テン゜ルネットワヌク図のようなものを意味するこずに泚意しおください。

ええ、TensorOperations.jlはよさそうです。 少し冗談でしたが、必芁なものを手に入れたした👍。

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