や、言語関係など覚えたいもの、覚えるべきものはたくさんある一方で、注目が集まっているから、やってみたい。ということでプログラミング言語としてのを学んでいく。
前回
2. Juliaの言語機能
2.6 多次元配列
には型という多次元配列が標準で用意されている。ここでは多次元配列の要素の型を、は次元の数を表す。ただし内部的には1次元配列であるため、たとえば長さのベクトル(1次元配列)を行列(2次元配列)に変換することは、値のコピーなく実行できる。
の多次元配列はインデックスがから始まり、要素の順番は列優先である。そのための行列で、同じ列の要素を順番に列挙するのは極めて高速である一方で、同じ行の要素を順番に列挙するのはあまり効率的でない。
2.6.5 ブロードキャスティング
サイズが異なる配列同士の演算を効率的に実行する仕組みとしてブロードキャスティングがある。ブロードキャスティングができるのは、
- 配列同士の各次元の大きさが同じ
- 次元の大きさが異なるものの片方のサイズが
という条件を満たす場合である。
############################## ### ブロードキャスティング ### ############################## # 行列のすべての要素に1つの値を作用させる A = ones(Float64,3,3) B = ones(Float64,3,3) println("******************") println(A + B) println(A .+ 1) # .+で同じ作用になる println("******************") B = ones(Float64, 1, 3) ### ブロードキャストの演算子 # 以下はいずれも同じ C₁ = A .+ B C₂ = broadcast(+, A, B) println("******************") println(C₁) println(C₂) println("******************") # sigmoid(x::Float64) = 1.0/(1.0 + exp(-x)) println("******************") D = sigmoid.(rand(Float64, 3, 3)) println(D) println("******************")
2.6.6 map, reduce, filter
配列の各要素に関数を作用させる関数としてがある。
########################### ### map, reduce, filter ### ########################### A = rand(3,2) println(A) println("**********************") # map: 各要素を引数として関数を適用する B = map(x -> x + 1.0, A) println(B) println("**********************") # reduce: 引数に取った配列の全要素を引数として関数を適用する C₁ = reduce(*, A) # Aの全要素の積を取る C₂ = 1.0 for i in 1:3 for j in 1:2 C₂ *= A[i,j] end end println(C₁) println(C₂) println("**********************") # 関数を適用した結果を抽出 D₁ = reshape(1:9,(3,3)) D₂ = isodd.(D₁) # 奇数か否か D₃ = filter(isodd, D₁) # 奇数のみを抽出 println(D₂) println(D₃) println("**********************")
2.6.7 サブ配列
配列の一部を表すのに用いるのがサブ配列である。具体的には関数を用いる。参照するのみであるため、巨大な配列から一部を取り出して計算するには、新たな配列を定義するよりも効率的な場合がある。
################ ### サブ配列 ### ################ A = rand(Float64,3,3) B = view(A,1,:) C = view(A,:,1:2) println("A=", A) println("B=", B) println("C=", C)