2

そう、これまでに何百万回も行われてきましたが、もう一度やりたいと思っています。私はそれを正しく行うことを意図して、C++ 用の単純な行列ライブラリを作成しています。数学ではかなり明白であるが、厳密に型付けされたシステムではそれほど明白ではないことに遭遇しました。1x1 行列は単なる数値であるという事実です。これを避けるために、私はベクトルの合成として行列の毛むくじゃらの道をたどり始めましたが、2 つのベクトルを乗算すると、2 つの方向に応じて、数またはダイアドになる可能性があるという事実にも遭遇しました。

私の質問は、C++ や Java のような強く型付けされた言語でこの状況に対処する正しい方法は何ですか?

4

3 に答える 3

3

数学ではかなり明白ですが、強く型付けされたシステムではそれほど明白ではありません。1x1 行列は単なる数値であるという事実です。

それは議論の余地があります。筋金入りの数学者 (私はそうではありません) は、おそらくそれに反対するでしょう。彼は、1x1 行列はスカラーと同型(またはそのようなもの) と見なすことができると言うでしょうが、それらは概念的に異なるものです。非公式な意味でのみ、「1x1 行列はスカラーである」(虚部のない複素数は「実数」であることに似ていますが、より強力です)。

その対応が強い型付け言語に反映されるべきではないと思います。そして、典型的な実装(複合体または行列の)では、そうではないと思います。Java Apache Commons 数学. たとえば、虚部がゼロの Complex は Number ではありません (型 POV から - それらは別の型にキャストできません)。

行列の場合、対応はさらに議論の余地があります。サイズ (4x3) x (1x1) の 2 つの行列を乗算できるようにする必要がありますか? 2 番目をスカラーと見なす場合、それは有効ですが、行列としてではありません。これは、乗算の行列の次元に関する制限に違反しているためです。そして、コモンズはそれに固執していると私は信じています。

弱く型付けされた言語 (Matlab など) では、別の話になります。

于 2010-06-05T12:27:55.627 に答える
2

SIMDの最適化などについて心配していなければ、テンプレート化されたテンソルを設定するのが最善の方法だと思います。最大テンソル次元を選択すると、次のようなことができます。

typedef Tensor3D< float, 4, 1, 1 > Vector4;

などなど。数学は、正しく実装されていれば、すべての形式の「行列」と「ベクトル」で機能します。結局のところ、どちらもテンソルの特殊なケースにすぎません。

編集:テンプレートのサイズを知ることは実際には非常に簡単です。GetRows()などの関数を追加すると、インスタンス化時にテンプレートに渡した値を返すことができます。

すなわち

template< typename T, int rows, int cols > class Tensor2D
{
public:
    int GetRows() { return rows; }
    int GetCols() { return cols; }
};
于 2010-06-05T08:01:34.853 に答える
0

私のアドバイス?1x1のケースを気にせず、夜は寝てください。ライブラリを使用して多数の数値を 1x1 行列としてモデル化することを突然決定し、実装について不満を言うユーザーについて心配する必要はありません。

これらの問題を解決する人は、それほど愚かではありません。マトリックスを使用するのに十分賢い場合は、それらを適切に使用するのに十分賢いです。

スカラーが導入するすべての順列に関しては、それらを説明する必要があると思います。行列ライブラリのユーザーとして、2 つの行列を掛け合わせて別の行列を取得し、行列を (列または行) ベクトルで乗算してベクトルの結果を取得し、行列にスカラーを掛けて別の行列を取得できることを期待しています。

2 つのベクトルを乗算すると、スカラー (内積) または行列 (外積) を取得できます。あなたの図書館はそれらを私にくれたほうがいいです。

それは些細なことではありません。他の人によって「正しく」行われましたが、自分でやり遂げたことを称賛します。

于 2010-06-05T12:56:44.630 に答える