- ベクトル
- ベクトルとは
ベクトル(vector)またはベクタとはn個の数値を組にしたもの。
nはベクトルの次元を表し、n次元ベクトルVは以下のように書くことができる。
\[
V=(v_1, v_2, \cdots, v_n)
\]
もしくはベクトル記号を使ってベクトルvを次のように書ける
\[
\vec{v}=(v_1, v_2, \cdots, v_n)
\]
v1、v2、vnはベクトルの成分(もしくは要素)という。
成分を指定する添え字(次元)は数値の他に次元に対応するラベルを使用することもできる。
例えばx、y平面上の2次元ベクトルを表す時はラベルx、yを使って以下のように書くことができる
\[
V = (v_x, v_y)
\]
もしくは
\[
\vec{v}=(v_x, v_y)
\]
ここでは主にn=2のケース,すなわち2次元ベクトルについて考える。
プログラミング言語では1次元配列に対応させることができる。
※ただしC/C++やJavaなどでは添え字が0から始まることに注意
- ベクトルの加算
ベクトル同士の加算は要素ごとに行う
\[
\vec{a}+\vec{b}=(a_1+b_1, a_2+b_2, \cdots, a_n+b_n)
\]
- ベクトルの減算
ベクトル同士の減算は要素ごとに行う
\[
\vec{a}-\vec{b}=(a_1-b_1, a_2-b_2, \cdots, a_n-b_n)
\]
- ベクトルの乗算(定数倍)
ベクトルと数値(スカラー)の乗算は要素ごとに行う
\[
s \vec{a}=(sa_1, sa_2, \cdots, sa_n)
\]
- ベクトルの除算(定数倍)
ベクトルと数値(スカラー)の除算は要素ごとに行う
\[
\frac{1}{s}\vec{a}=(\frac{a_1}{s}, \frac{a_2}{s}, \cdots, \frac{a_n}{s})
~~~~(s \neq 0)
\]
- ベクトルの長さ(ノルム)
\[
|\vec{a}|=\sqrt{a_1^2 + a_2^2 + \cdots + a_n^2 }
\]
- ベクトルの正規化
ベクトルの各成分の比率を維持しながら長さを1にする
\[
normalize(\vec{a})=\frac{1}{|\vec{a}|}\vec{a}
~~~~(|\vec{a}|\neq 0)
\]
- ベクトルの内積(ドット積、スカラー積)
ベクトル同士の内積は要素ごとの積の和として定義される。結果は数値(スカラー)になる。(スカラー積)
2つのベクトルのなす角度が鋭角の時は正、直角の時は0、鈍角の時は負の値をとる性質がある。
行列の積に相当する。
\[
\vec{a} \cdot \vec{b}=a_1b_1+a_2b_2+ \cdots +a_nb_n
\]
もしくは
\[
\vec{a} \cdot \vec{b}=|\vec{a}||\vec{b}|cos \theta
\]
- ベクトルの外積(クロス積、ベクトル積)
3次元の外積は以下のように定義される。結果はベクトルになる。(ベクトル積)
外積によって得られたベクトルは2つのベクトルによって3次元空間に張られた面の法線方向を向く
\[
\vec{a} \times \vec{b}=(a_yb_z-a_zb_y, a_zb_x-a_xb_z, a_xb_y-a_yb_x)
\]
- ベクトルクラスの実装(2次元ベクトル)
- 2次元ベクトルクラスVector2D
n次元ベクトルは要素nの1次元配列に対応させることができる。
ただし、ここではx、y平面上の2次元ベクトルを扱うことを想定して配列を利用せず変数xとyを成分として扱う
2次元ベクトルを表すVector2Dクラスは以下のように書ける
class Vector2D{
double x;
double y;
};
加算
1引数(フィールドに反映)
public void add(Vector2D v) {
this.x+=v.x;
this.y+=v.y;
}
2引数(新しいオブジェクトを返す)
public Vector2D add(Vector2D v1,Vector2D v2) {
return new Vector2D(v1.x+v2.x,v1.y+v2.y);
}
減算
1引数(フィールドに反映)
public void sub(Vector2D v) {
this.x-=v.x;
this.y-=v.y;
}
2引数(新しいオブジェクトを返す)
public Vector2D sub(Vector2D v1,Vector2D v2) {
return new Vector2D(v1.x-v2.x,v1.y-v2.y);
}
乗算
1引数(フィールドに反映)
public void sub(Vector2D v) {
this.x*=v.x;
this.y*=v.y;
}
2引数(新しいオブジェクトを返す)
public Vector2D mult(Vector2D v,double s) {
return new Vector2D(v.x*s,v.y*s);
}
除算
1引数(フィールドに反映)
public void div(double s) {
if(s==0.0)return;
this.x/=s;
this.y/=s;
}
2引数(新しいオブジェクトを返す)
public Vector2D div(Vector2D v,double s) {
if(s==0.0)return null;
return new Vector2D(v.x/s,v.y/s);
}
ベクトルの長さ
public double mag() {
return Math.sqrt(x*x+y*y);
}
正規化
public void normalize() {
double invNorm=1.0/Math.sqrt(x*x+y*y);
x*=invNorm;
y*=invNorm;
}
内積
public void normalize() {
double invNorm=1.0/Math.sqrt(x*x+y*y);
x*=invNorm;
y*=invNorm;
}
サンプルコード