教材一覧へ

VectorとVector2Dを実装する

課題3(コーディング レベル3)

課題のゴール

抽象クラス

一般のn次元ベクトルを表す抽象クラス Vector と、それを継承した2次元ベクトル Vector2D を実装しよう。

  1. Vector.java に、すべてのベクトルに共通するフィールドと操作を実装する。
  2. LMSから入手した Vector2D.java に、コンストラクタと3つのベクトル演算を実装する。
  3. LMSで配布された VectorMain.java を使って動作を確認する。
VectorMain.java は修正・変更しないこと。

クラスの関係

extends
abstract Vector次元・要素・共通操作
↓ 継承して抽象メソッドを実装
extends Vector
Vector2D2次元ベクトルの具体的な計算

Vectorがデータの持ち方と操作の形を定め、Vector2Dが2次元の場合の計算方法を完成させます。

3つのベクトル演算

u・v・s
スカラー倍s・u = (su₀, su₁)
内積u・v = u₀v₀ + u₁v₁
加算u + v = (u₀+v₀, u₁+v₁)

Vectorの仕様

n次元
種類宣言役割
フィールドprivate int dimensionベクトルの次元
フィールドprivate double[] elements各要素。長さはdimension
コンストラクタVector()dimensionを2で初期化
コンストラクタVector(int dimension)次元と配列を初期化
getterint getDimension()次元を返す
settervoid setDimension(int dimension)次元を設定し、配列を作り直す
getterdouble getElement(int i)i番目の要素を返す
settervoid setElement(int i, double e)i番目へeを設定
メソッドString toString()(x1, x2, ..., xn) を返す
抽象メソッドdouble innerProduct(Vector v)内積を返す
抽象メソッドVector scalarMultiplication(double scalar)スカラー倍を返す
抽象メソッドVector addVector(Vector v)加算したベクトルを返す
setDimension ではdimensionを変更するだけでなく、elementsも新しい長さの配列として初期化します。

Vector2Dの仕様

2次元
種類宣言役割
フィールドなしVectorのelementsを利用
コンストラクタVector2D()親のdimensionを2で初期化
コンストラクタVector2D(double x, double y)次元を2とし、0番目へx、1番目へyを設定
メソッドdouble innerProduct(Vector v)thisとvの内積
メソッドVector scalarMultiplication(double scalar)thisのスカラー倍
メソッドVector addVector(Vector v)thisとvの加算

提出前チェック

確認
  • Vectorを abstract class として宣言している
  • dimensionとelementsを private にしている
  • dimensionを変更するとelementsも同じ長さで作り直される
  • Vector2Dはフィールドを追加せず、Vectorのメソッドで要素を扱っている
  • Vector2Dで3つの抽象メソッドを実装している
  • VectorMain.javaを変更していない

演算を確認

実行イメージ
● ● ● Terminal
> javac -encoding utf8 Vector*.java
> java VectorMain
v1 = (1.0, 2.0)
v2 = (3.0, 4.0)
scalar*v1 = 5.0*(1.0, 2.0) = (5.0, 10.0)
v1 * v2 = (1.0, 2.0) * (3.0, 4.0) = 11.0
v1 + v2 = (1.0, 2.0) + (3.0, 4.0) = (4.0, 6.0)

Vector.java

public abstract class Vector {
  private int dimension;
  private double[] elements;

  public Vector() {
    // dimensionを2で初期化する

  }

  public Vector(int dimension) {
    // dimensionとelementsを初期化する

  }

  public int getDimension() {
    // dimensionを返す

  }

  public void setDimension(int dimension) {
    // dimensionを設定し、elementsを作り直す

  }

  public double getElement(int i) {
    // elementsのi番目を返す

  }

  public void setElement(int i, double e) {
    // elementsのi番目へeを設定する

  }

  public String toString() {
    // ベクトルを「(x1, x2, ..., xn)」の形で返す

  }

  abstract double innerProduct(Vector v);
  abstract Vector scalarMultiplication(double scalar);
  abstract Vector addVector(Vector v);
}

Vector2D.java

public class Vector2D extends Vector {
  public Vector2D() {
    // スーパークラスのコンストラクタでdimensionを2にする

  }

  public Vector2D(double x, double y) {
    // スーパークラスのコンストラクタでdimensionを2にする

    // 0番目へx、1番目へyを設定する

  }

  public double innerProduct(Vector v) {
    // thisとvの内積を返す

  }

  Vector scalarMultiplication(double scalar) {
    // thisをscalar倍した新しいベクトルを返す

  }

  Vector addVector(Vector v) {
    // thisとvを加算した新しいベクトルを返す

  }
}

コンパイルと実行

Terminal
// 3つのJavaファイルを同じフォルダに置いて実行
javac -encoding utf8 Vector*.java
java VectorMain