みなさん、はじめまして。Ruby歴(=OOP歴)1週間の田中と申します。
添付ライブラリのVectorクラスは、複素数に対してあまり考慮されていないよ
うなので、無謀にも、その書き換えを画策しました。
具体的には、inner_productおよびrメソッドを書き換え、
a.inner_product(b)ならば、aの各成分の複素共役をとってから、bの各成分と
の積を求める(rメソッドも同様)ようにする、というものです。
#これが、内積本来の定義?
そこで、Vectorクラス内において、
def initialize(method, array, copy)
@comp = $".include?("complex.rb")
self.send(method, array, copy)
end
def inner_product(v)
Vector.Raise ErrDimensionMismatch if size != v.size
p = 0
if @comp
each2(v) {
|v1, v2|
p += v1.conjugate * v2
}
else
each2(v) {
|v1, v2|
p += v1 * v2
}
end
p
end
def r
v = 0
if @comp
for e in @elements
v += (e.conjugate*e)
v = v.real
end
else
for e in @elements
v += e*e
end
end
return Math.sqrt(v)
end
としました。
とりあえず、意図どおり動作しているようですが、数々の疑問がわいてきます。
1) @comp = $".include?("complex.rb") はinitializeに書いてよいのか。
2) compは、インスタンス変数とすべきなのか。
3) inner_product, r内の if @comp 〜 else … では、〜と…はほとんど同じ
処理で、美しくない。別の書き方はないのか。
@comp ? v1.conjugate : v1なども考えたが、これはループごとに
@comp評価が起こり(?)、無駄である。
以上、ご教示よろしくお願いします。
田中 健太(TANAKA Kenta)
論理によって証明し、直感によって考え出す。