情報科学概論
2001.6.5の復習課題に関するヒント
(2001.6.25更新)



課題

2行2列の行列の積を求めるスクリプトを作成せよ。なお、スクリプトは行列の次元が上がった場合にも対応できることが望ましいので、きちんと計算を抽象化して実行すること。ここで言う「抽象化」とは、積を求める式は一つだけ、ということを意味する。また、行列の例として以下のようなものをあらかじめ提示しておく。別にその数値にこだわる必要はないので、自分で別の値を持つ行列を試すのも可能であるが、はじめにまずこの行列により計算してみること。

     


ヒント

  • まずは、例に挙げた行列を配列に直す。これはスクリプトではなく手作業で行えばよい。先週の課題と同様多重の配列となる。

  • 求める行列に対応する配列の定義をしておく。通常の配列であれば、

     c = []

    のように空の配列を用意すればよいが、多重配列なので、

     c = [[], []]

    とする必要がある。

  • 次に、行列の積について、どのような組み合わせで行うのか、じっくりと考えてからスクリプト上での計算方法を検討する。こちらも先週と同様、二重のループとして、例えばiとjの二つの変数を操作して全ての要素を網羅するようにする。この段階では数値を使うと分かりにくくなるので、行列の要素をaijなどのように表記するとわかりやすい。

  • 課題のページでも指定したように、計算式は一つで済ませる。すなわち、求める行列に相当する配列をcすると、

     c[i][j] =

    というような計算をループの中で行うことになる。

    このときにどのようなijを使うとc[i][j]が表現できるかを考える。以下は簡単化 のため、通常の行列表記により説明する。まず、c行列の要素cijは以下のように表現 される。

    c11=a11b11+a12b21
    c12=a11b12+a12b22
    c21=a21b11+a22b21
    c22=a21b12+a22b22

    この順番のままではijの規則性がわかりづらいので二つの式について順番を変える と、

    c11=a11b11+a12b21
    c12=a12b22+a11b12
    c21=a21b11+a22b21
    c22=a22b22+a21b12

    そうすると一番始めにあるaの添え字は明らかな特徴を持っているし、それとかけ あわせてあるbの添え字も規則性が明確である。問題は2項目の積であり、ここには cにおけるjが1ならば2、2ならば1になるような規則性を持った添え字が現れる。そ の表現方法を見いださなければならない。

  • 循環数というものを利用すると上のような簡単な表現が実現できる。たとえば、

     0 -> 1 -> 2 -> 0

    というようの限られた数の中で順番に回っていくような数である。この実現は単純には別の配列、

     junkan = [1, 2, 0]

    を用意することによっても実現できるが、剰余(ある数で割ったあまり)というメ ソッドでも実現できるし、その方がスマートになる。剰余メソッドの説明は教科書 p.80にある。具体的には添え字は0か1かのどちらかなので、2で割った余りで対応 できそうである。(2行2列の場合の特殊なケースとしては剰余を使わないもっと簡 単な式も可能である。)


  • 課題ページに戻る

    目次ページに戻る