はじめMath! Javaでコンピュータ数学

第40回行列の数学 行列の加減算

ベテランと初心者の違いは何でしょうか。その一つは「楽をする」方法を知っていることです。同じことをしても、ベテランは無駄な力を使わず必要なだけの力で道具を用い、楽に仕事をこなします。これに対して初心者は要らないところに力を使い、肝心なことに力が回りませんから疲れるばかりで仕事がはかどりません。

柔道や剣道、ボクシングにレスリング。例えればきりがありませんが、スポーツの世界では特にその様子が如実に表れます。確かにベテランと呼ばれる人たちは鍛え上げた肉体を持っていますから、初心者相手には楽に対戦することが出来ます。しかし、力だけでは説明できない部分があります。それが「技」です。必要なところで必要なだけの力を抜かりなく使い、効率よく楽に勝つ技があるのです。

私たちにとって、行列の数学は、計算という仕事をコンピュータに任せて、楽にこなすための技に例えて良いでしょう。この技を知っていれば、鼻歌を歌いながら計算結果を得ることだって出来ます。この技を知らなければ、一生かかっても解けない計算問題があります。知ると知らないとで大きな違いがあります。これを身につけないなんて、調理道具を持っているのに料理の作り方を学ばないのと一緒です。もったいないったらありません。

さあ、行列の数学も本番、複数の行と列のある一般的な行列の数学が始まります。学生時代に植え付けられた悪いイメージは捨て去って、このすてきな道具をあなたの道具箱に加えてください。

図40.1 抜かりなく楽をするのがプロの技
図40.1 抜かりなく楽をするのがプロの技

改めて行列とは

前回までに紹介した行列は、1行だけ、あるいは1列だけのものでした。今回は行・列ともに複数の広い意味での行列を紹介します。

数学的に一般的な意味での行列とは、式40.140.2に示すように、数値を長方形に並べたもののことです。

集合と異なるのは、行列では数値の位置や順番に意味があることです。

並んだ数値一つ一つのことを、この行列の成分または要素といいます。縦か横一直線に並んだ式40.340.4のような行列のことを特にベクトル(vector)といいます。行列の横の並びを(row⁠⁠、縦の並びを(culumn)といいます。

ある行列と別の行列が等しい(=で結ばれる)のは、2つの行列の行数、列数が等しく、対応する成分が全て一致する場合です。

行列の具体的な姿

行列を使った場合と、使わなかった場合の式の違いを見てみましょう。すると、行列を使って書いた場合がどんなにシンプルか分かります。実際に鉛筆で紙に書き写してみると、きっともっとよく分かります。

式40.540.6を行列を用いて書き直すと次のように書くことができます。

一般的な行列の加減算や乗算については今後学習しますから、上に紹介した式の詳しい意味が分からなくても、今は心配しないでください。ただ、これらの式が同じ意味を表しているのだとしたら、どちらがシンプルだと思いますか?圧倒的に後者だと思いませんか?なぜなら式40.5 と40.6に登場していた加算記号、乗算記号が後者には登場しません。まるでマジックのように隠れてしまいました。

初めてこのカラクリに触れると、なんだか大変な忘れ物をしてしまったようで不安になるかもしれません。しかし、慣れてしまうとこの方が大変楽なため、離れられなくなります。少しの不安があることと思いますが、ここは勇気を持ってこの行列の書き方を受け入れてください。コンピュータを使う人にとって、行列の数学は今後どんどん御利益に預かれるものであることが間違いないからです。

行列の加減算

行列の加減算は、2つの行列の行数同士、列数同士が等しいときに行うことが出来ます。

次に計算例を示します。

式40.10の通り、行列同士の加算は、行列の同じ位置の成分同士を加算すればよいのです。減算も同様で、同じ位置の成分を減算します。大変シンプルですから、プログラムでこれを表現するのは難しくなさそうですね。

交換法則・結合法則

行列の加減法にはスカラ値の加減算と同様に交換法則と結合法則が成り立ちます。順番を入れ替えても、計算の順序を変えても結果が変わりません。

表40.1 行列の加減算での交換法則・結合法則
法則名演算の例
交換法則A+B=B+A
結合法則(A+B)+C=A+(B+C)

零行列

行列の加減算の結果、全ての成分がゼロになることがあります。このような行列を零行列といいます。同じ行列同士を減算すると零行列になりますし、ある行列に零行列を足しても引いても変化がありません。式40.12のように、零行列には0という特別な記号が割り当てられています。この記号を用いた方が、手で書く場合は簡単ですし、間違いがありませんね。

問題:行列の減算を行う関数を作りましょう。

整数を成分として持つ行列の減算メソッドを、配列を用いて作ってください。問題を簡単にするために、行列は2×2に限定します。次元の異なるもの同士の計算を行おうとした場合は標準出力に「演算できません」と表示し、強制終了するようにしましょう。連載第38回の問題の解答を修正し、一般的な行列の減算を行うメソッドにしましょう。

メソッドはvSubMatrix(A,B,C)のように呼び出しましょう[1]⁠。行列Aと行列Bの差を行列Cに格納してください。

解説

行列の減算は、連載第38回の解答を少々変更すれば実現できます。参考に解答例を示します。

ソースコード:HairetsuDeMatrixSub.java
///サンプルコード
//行列の差をとる。配列版。
//filename : HairetsuDeMatrixSub.java

class HairetsuDeMatrixSub {

  public static void main(String[] args) {

    int a[][] = //行列A
      { { 3,4 },
        { 5,6 } };
    int b[][] = //行列B
      { { 1,2 },
        { 3,4 } };
    int c[][] = new int[2][2]; //行列C

    //C = A - B
    vSubMatrix(a,b,c);
    //結果表示
    for( int i = 0 ; i 

今回は問題を簡単にするために2×2の行列に限りました。しかし、任意の行列の減算を行うプログラムを実際に考えると、とたんに複雑になります。発展課題として任意の行列に対応するものを考えてみられてはいかがでしょうか。

今回はここまで

今回は行列の一般的な形を学びました。前回まで学んできた「ベクトル」は、1行だけ、あるいは1列だけという特別な場合です。

行列を用いると、用いない場合に比べて大変シンプルに式を表現できます。ものごとをシンプルに表現できるというのは大変なメリットです。その他の単純に出来ないことを考えるために集中できます。そして、行列の計算は単純な約束の繰り返しです。単純な約束事の繰り返しは、コンピュータの得意とするところ、コンピュータがまさに長所を生かせる分野なのです。

おすすめ記事

記事・ニュース一覧