julia で内積を計算する入力方法, NumPy の行列かけ算との違い

julia で内積を計算する入力方法は2つあります。dot() と演算記号の「⋅」を使う方法です。

まず、julia 1.0.x 以上では、おまじないが必要です。


julia> using LinearAlgebra


dot() は入力には困りませんが、演算記号の「⋅」はどうやって入力しましょう?

MacOS X では、alt+8 で「•」 という記号が入力できます。しかし、これでは計算してくれません。

演算記号の「⋅」は、TeXの \cdot に続いて タブを押す方法で入力できます。 \alpha などもタブで「α」に変換してくれます。


julia> a=[1,2,3]
3-element Array{Int64,1}:
 1
 2
 3

julia> b=[4,5,6]
3-element Array{Int64,1}:
 4
 5
 6

julia> a*b
ERROR: DimensionMismatch("Cannot multiply two vectors")
Stacktrace:
 [1] *(::Array{Int64,1}, ::Array{Int64,1}) at ./linalg/rowvector.jl:184

julia> a.*b
3-element Array{Int64,1}:
  4
 10
 18

julia> a\cdot<-ここで続けてタブです

julia> a⋅b
32

julia> dot(a,b)
32


PyCall で NumPy を呼び出して同じ演算をしてみしょう。


julia> using PyCall

julia> @pyimport numpy as np

julia> np.dot(a,b)
32


1×n のベクトルでは、numpy の numpy.dot() と julia の dot() は同じです。

しかし、n×m になると異なるので注意が必要です。


julia> A = [1 2 ; 3 4]
2×2 Array{Int64,2}:
 1  2
 3  4

julia> B = [5 6 ; 7 8]
2×2 Array{Int64,2}:
 5  6
 7  8

julia> A⋅B
ERROR: MethodError: no method matching dot(::Array{Int64,2}, ::Array{Int64,2})

julia> np.dot(A,B)
2×2 Array{Int64,2}:
 19  22
 43  50

julia> A*B
2×2 Array{Int64,2}:
 19  22
 43  50

julia> A.*B #ブロードキャストでは、同じ位置のかけ算
2×2 Array{Int64,2}:
  5  12
 21  32


julia の dot() は純粋に、内積に対して使われるようです。

B! LINE