module VectorCalc #●加える def self.add(v1 , v2) tarray = [] v1.each_index do |i| tarray.push(v1[i] + v2[i]) end return tarray end #●加える def self.add2(array) array.inject {|result , v| add(result ,v)} end #●加える def self.add3(array,array2) subtract(add2(array) , add2(array2)) end #●引く def self.subtract(v1 , v2) tarray = [] v1.each_index do |i| tarray.push(v1[i] - v2[i]) end return tarray end #●スカラーの作用 def self.scalar_action(c , array) array.collect{|v| c * v} end #●L2ノルム def self.norm2(array) Math.sqrt(array.inject(0) {|result , v| result + v ** 2}) end #●正規化 def self.normalize(v) self.scalar_action((1 / self.norm2(v)) , v) end #●直交するベクトル def self.ortho_vector(v) [v[1] , - v[0]] end #●内積 def self.inner_product(v1 ,v2) sum = 0 v1.each_index do |i| sum += v1[i] * v2[i] end return sum end #●対角写像の像 def self.diagonal(d , a) [a] * d end #●対角写像の像 def self.diagonal2(v , a) [a] * v.size end #●ベクトルへの射影 def self.projection1(base_vector ,vector) nbase = normalize(base_vector) return scalar_action(inner_product(vector ,nbase) , nbase) end #●ベクトルの回転 def self.rotate2(vector , phase) c = Math.cos(phase) s = Math.sin(phase) [vector[0] * c - vector[1] * s , vector[0] * s + vector[1] * c] end #●2つのベクトルの差の角度 def self.angle(vector , vector2) cos = 1.0 * inner_product(vector, vector2) / (norm2(vector) * norm2(vector2)) return acos(cos) end end