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

第38回 行列の数学 ベクトルとベクトルの加減算

この記事を読むのに必要な時間:およそ 3 分

問題:ベクトルの加算を行う関数を作りましょう。

整数を成分として持つベクトルの加算メソッドを,配列版とArrayList版それぞれで作ってください。次元数はあらかじめわからないものとします。

引数として渡された配列やArrayListの要素数から次元数を判断し,次元の異なるもの同士の加減算を行おうとした場合は標準出力に「演算できません」と表示し,強制終了(※2するようにしましょう。

関数はAddMatrix(A,B,C)のように呼び出しましょう。行列Aと行列Bの和を行列Cに格納してください。

配列版はvAddMatrix(A,B,C)ArrayList版はaAddMatrix(A,B,C)という関数にしてください。

※2)
System.exit(0);を実行します。関数呼び出しで例外を生じた際,強制終了するというのはお行儀の悪いことですが,話をシンプルにするためにあえてそのようにしました。

解説

先に配列版を示します。ベクトルの加減算は最もシンプルで考えやすい題材です。プログラミングを始めたばかりの人にとっては,ほどよい難易度の問題だったことでしょう。プログラミングを始めてしばらく経った人は,データの取り扱いに注意を払って実用的なメソッド作りを心がけると良いでしょう。

ソースコード:HairetsuDeMatrixAdd.java

///サンプルコード
//行列(ベクトル) の和をとる。配列版。
//filename : HairetsuDeMatrixAdd.java

class HairetsuDeMatrixAdd {

  static final int MAX_LENGTH = 255; //配列長の最大値

  public static void main(String[] args) {

    int a[] = {1,2,3,5,8}; //ベクトルa
    int b[] = {2,4,5,7,9}; //ベクトルb
// int b[] = {2,5}; //要素数が異なると加算できない
    int c[] = new int[MAX_LENGTH]; //ベクトルc

    //C = A + B
    vAddMatrix(a,b,c);
    //結果表示
    for( int i = 0 ; i < a.length ; ++i ){
      System.out.println("a["+i+"] + b["+i+"] = c["+i+"]");
      System.out.println(a[i] + " + " + b[i] + " = "+ c[i]);
    }
  }// end of main


  static void vAddMatrix(int a[], int b[], int c[]){
    if (a.length == b.length){
      //加算可能
      for( int i = 0; i < a.length ; i++){
        c[i] = a[i] + b[i];
      }
    } else {
      //加算不能
      System.out.println("加算できません");
      System.exit(0);
    }
  }

}// end of class HairetsuDeMatrixAdd

次にArrayList版を示します。ベクトルの加算と言うことに関しては,配列版と大きな差がありません。ArrayListクラスの使用練習として,やさしい課題だったはずです。

ソースコード:ArrayListDeMatrixAdd.java

//サンプルコード
//行列(ベクトル)の和をとる。ArrayList 版。
//filename : ArrayListDeMatrixAdd.java

import java.util.ArrayList;

class ArrayListDeMatrixAdd {

  public static void main(String[] args) {

    //ベクトルA の宣言と初期化
    ArrayList<Integer> A = new ArrayList<Integer>();
    int a[] = {1,2,3,5,8};
    for (int i=0 ; i < a.length ; ++i ) A.add( a[i] );
    //ベクトルB の宣言と初期化
    ArrayList<Integer> B = new ArrayList<Integer>();
    int b[] = {2,4,5,7,9};
// int b[] = {2,5}; //要素数が異なる場合は加算できない
    for (int i=0 ; i < b.length ; ++i ) B.add( b[i] );
    //ベクトルC の宣言
    ArrayList<Integer> C = new ArrayList<Integer>();

    //C = A + B
    aAddMatrix(A,B,C);
    //結果表示
    for( int i=0 ; i < A.size() ; ++i ){
      System.out.println("A("+i+") + B("+i+") = C("+i+")");
      System.out.println(A.get(i)+" + "+B.get(i)+" = "+C.get(i));
    }
  }// end of main


  static void aAddMatrix(ArrayList<Integer> A, ArrayList<Integer> B,
                         ArrayList<Integer> C){
    if (A.size() == B.size()){
      //加算可能
      for( int i = 0; i < A.size() ; i++){
        C.add( A.get(i) + B.get(i) );
      }
    } else {
      //加算不能
      System.out.println("加算できません");
      System.exit(0);
    }
  }

}// end of class HairetsuDeMatrixAdd

今回はここまで

Java言語を用いて,ベクトルの加減算が容易に実装できることを学びました。実用に耐えるものにするためには,計算結果がIntegerの許容範囲からオーバーしないか(オーバーフローしないか)のチェックをしたり,メソッドそのものがIntegerだけでなく,LongやDouble等の型(クラス)に対応したものであるべきでしょう。そのようなことについては,今後の皆さんの発展課題として記憶しておかれると良いでしょう。

今回のまとめ

  • ベクトルの加減算の方法を学びました。
  • ベクトルの加減算はJava言語で比較的容易に実装することが出来ます。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。