2017年3月9日木曜日

JuliaLang: シングルクォート ' は転置じゃなくて複素共役転置

確認環境
Julia v0.5.1

タイトルの通り、Julia (MATLABでも同じだが) において行列 A に対して A' とすることは $A^{T}$ ではなく $A^{\dagger}$ (数学屋さんにとっては $A^*$ ?)。
正真正銘の転置を取りたい場合は A.' とドットを入れる。

よって ' と等価な関数は transpose ではなく ctranspose。
.' と等価な関数が transpose。

個人的には衝撃の事実。Julia を使って1年位になるが全く気づかなかった。
Help には普通に書いてあった。

help?> transpose
search: transpose transpose! ctranspose ctranspose!

  transpose(A)

  The transposition operator (.').

help?> .'
search:

  .' is the transposition operator:

  julia> A = reshape(1:4, 2,2)
  2×2 Array{Int64,2}:
   1  3
   2  4
  
  julia> A.'
  2×2 Array{Int64,2}:
   1  2
   3  4
  
  julia> B = A + im
  2×2 Array{Complex{Int64},2}:
   1+1im  3+1im
   2+1im  4+1im
  
  julia> B.'
  2×2 Array{Complex{Int64},2}:
   1+1im  2+1im
   3+1im  4+1im

help?> ctranspose
search: ctranspose ctranspose!

  ctranspose(A)

  The conjugate transposition operator (').

help?> '
search:

  ' is the conjugate transposition operator:

  julia> A = reshape(1:4, 2,2)
  2×2 Array{Int64,2}:
   1  3
   2  4
  
  julia> A'
  2×2 Array{Int64,2}:
   1  2
   3  4
  
  julia> B = A + im
  2×2 Array{Complex{Int64},2}:
   1+1im  3+1im
   2+1im  4+1im
  
  julia> B'
  2×2 Array{Complex{Int64},2}:
   1-1im  2-1im
   3-1im  4-1im

浮動小数点の行列に対して行った場合、 .' のほうが気持ち早いが大した違いではなかった。

julia> x = rand(1000,1000);

julia> @benchmark x'
BenchmarkTools.Trial: 
  memory estimate:  7.63 MiB
  allocs estimate:  2
  --------------
  minimum time:     3.728 ms (0.00% GC)
  median time:      4.746 ms (0.00% GC)
  mean time:        4.812 ms (7.40% GC)
  maximum time:     56.469 ms (90.76% GC)
  --------------
  samples:          1033
  evals/sample:     1
  time tolerance:   5.00%
  memory tolerance: 1.00%

julia> @benchmark x.'
BenchmarkTools.Trial: 
  memory estimate:  7.63 MiB
  allocs estimate:  2
  --------------
  minimum time:     3.377 ms (0.00% GC)
  median time:      3.926 ms (0.00% GC)
  mean time:        4.416 ms (6.49% GC)
  maximum time:     56.808 ms (90.80% GC)
  --------------
  samples:          1126
  evals/sample:     1
  time tolerance:   5.00%
  memory tolerance: 1.00%

0 件のコメント :

コメントを投稿