投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/10/4 11:02:08
> Vector型がどういう時に使うのか、どういう物なのか正直全く分からず、
ざっくり言えば「ベクトル値を保持し、計算に使うための型」ですね。
高校数学Bの『ベクトル』(分野によってはベクターとも呼ばれる)のこと。

グラフィック系を扱っていると、三角関数であるとか、行列演算であるとか、複素数といった数学用語が出てくることもありますが、
ベクトルという用語も、そんな中の一つに過ぎません。小難しい話は高校の教科書にでもお任せするとしましょう。

実際のところ、一口に「ベクトルを表す型」といっても、世の中には様々なVector系構造体の C# 実装があります。
3D 系の場合、OpenTK を使っているならば System.Numerics.Vector3 ではなく OpenTK.Vector3 が
使われていたりしますし、WPF ならば  System.Windows.Media.Media3D.Vector3D が利用されます。
3 次元物理回転をエンコードするために使用されるベクトルを表す System.Numerics.Quaternion 構造体などもあります。

とはいえいずれも、ベクトル値を管理するという主目的は同じです。

数学的には、ベクトルとは「方向と大きさ」のように、互いに独立な複数の異なる値の組み合わせとして表される量のこと。
たとえば質量や温度といったデータは、大きさはありますが向きはありません(スカラー値)。
速度や力といったデータは、大きさだけでなく向きも含んでいます(ベクトル値)。
物理学や自然科学においては、回転変換に対する変換性によって特徴付けられる量をベクトル量と呼びますし
分野によって多少意味合いが異なることがありますが、まぁ根っこは同じです。

ML なんかで出てくるテンソル(Tensor)は、これらをさらに一般化したもので。
スカラー値(質量や温度など)は階数 0 のテンソル、
ベクトル値(力や運動量など)は階数 1 のテンソル、
行列(力や加速度ベクトルの異方的な線型変換)では階数 2 のテンソル

…閑話休題。

System.Windows.Vector では、2 つの double 値(X プロパティと Y プロパティ)を管理しています。
System.Windows.Media.Media3D.Point3D では、3 つの double 値(X、Y、Z プロパティ)を管理しています。
System.Numerics.Vector2 では、2 つの float 値(X プロパティと Y プロパティ)を管理しています。
System.Numerics.Vector3 では、3 つの float 値(X、Y、Z プロパティ)を管理しています。
System.Numerics.Vector4 では、4 つの float 値(X、Y、Z、W プロパティ)を管理しています。

このほかにも色々あるのですが、それはひとまず置いといて。

2 つの値、3 つの値を保持しているという点だけ見ると、
System.Drawing.PointF 構造体や System.Windows.Media.Media3D.Point3D 構造体に似ていますが、
Point、PointF、Point3D といったものが「座標位置」を表しているに対し、
Vector 系の方は「変位」を表すための型という違いがあります。
たとえば、PointF は PointF 同士の加算や減算をサポートしますが、
Vector2 型であれば、ベクトル値とスカラ値の乗除算や行列演算なども効率よく行えます。

とはいえ、これら Vector 系の型を使わずに実装することもできますので、言語習得に必須というほどではないです。

組となる複数の値を保持する、と要件だけ見れば、n 次元の配列を使って管理したり、
Tuple クラス / ValueTuple 構造体による所謂 `n-Tuple` で表現することもできるので
Vector クラス / Vector<T> 構造体を知らなくてもコーディングできなくはないです。

スカラー値や 0 軸テンソルとなら int や float、
ベクトル値や 1 軸テンソルなら、int[] や float[] などの 1 次元配列や List<T> など、
2 軸テンソルなら、3 次元配列などといった具合に。

とはいえ、専用の型がある場合、それを使うことで効率よく書ける場面があるのは確かですし、
習得する意義があるかどうかは、プログラミングの目的や要件、そして自身の理解度次第ですね。