LoginSignup
3
3

More than 5 years have passed since last update.

初めてのeval (変数名を規則的に動かして行列単位を書いてみる)

Posted at

変数名を規則的に変化させる場合には,evalを使えば手動で頑張らなくていいことを知ったので備忘録として書いておきます.ただ,以下に書くものが最良とは思っていません.もし,もっと良い書き方があれば教えていただけると嬉しいです.

メソッドとして行列単位を書く

行列のサイズは2×2しか出てこないプログラムを想定する.
まずはevalを使わないで次のようにメソッドとして行列単位((i,j)成分は1,その他は0)を書いてみる.

matrix1.rb
require "matrix"
def e(i,j)
    Matrix.build(2){|k,l| (k==i && l==j)? 1 : 0}
end

でもこれでは,何度もe(i,j)が出てくると括弧を書くのが面倒になってくる.
2×2しか出てこないのだから,括弧がなくても誤解の心配はない.
そこでevalを使って括弧を外すことを試みる.

グローバル変数として行列単位を書く

matrix2.rb
require "matrix"
def e(i,j)
    Matrix.build(2){|k,l| (k==i && l==j)? 1 : 0}
end

(0..1).each do |i|
    (0..1).each do |j|
        eval("$e#{i}#{j}=e(i,j)")
    end
end

p $e01 #=> Matrix[[0, 1], [0, 0]]

これで括弧を書かずに済むが,その分$を書くことになってしまった.

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3