3

マトリックス クラスで問題が発生しましたが、解決策が見つかりません。

Matrix = ROWSxCOLUMNS

Let A be a 3x4 matrix
Let B be a 4x5 matrix

操作AxB(A の列が B の行と一致する場合にのみ定義される) は、 になり3x5 matrixます。まさにそれを行うテンプレート化されたクラスを作成したかったのです。

Matrix<int,3,4> A;
Matrix<int,4,5> B;
Matrix<int,3,5> matrix = A*B;

私のコード:

    template <class T, unsigned int ROWS, unsigned int COLUMNS>
    class Matrix {
      public:

        /* blabla */

        const Matrix<T, ROWS, /* ? */ >&
          operator*(const Matrix<T, COLUMNS, /* ? */ >& matrix) const
        {
          /* multiplication */
        }

        /* blabla */
    };

/* ? */セクションに何を挿入すればよいかわかりません。コンパイラが符号なし整数値を受け入れるようにする方法はありますか? 別の方法でコードを書き直す必要がありますか?

注: 私はこのクラスを学術目的で作成しています。これを行うライブラリが既に存在するかどうかは気にしません。

4

2 に答える 2

3

整数テンプレート パラメーターでテンプレート メンバー関数を使用します。

template<class T, unsigned int ROWS, unsigned int COLUMNS>
class Matrix {
public:
    ... 
    template<unsigned int N>
    Matrix<T, ROWS, N>
    operator*(const Matrix<T, COLUMNS, N>& matrix) const
    {
          /* multiplication */
    }
    ...
};

また、参照によって値を返さないでください。

于 2012-12-15T16:51:15.697 に答える
2

この例を見ることができますが、トリプル ループ (非常に非効率的) を実行する代わりに、インテル® MKL にデリゲートしdgemmます。

operator*()また、名前付き戻り値の最適化 (NRVO) が有効になっているコンパイラがあり、それが動作することをテストしていない限り、結果を値で返す必要があるため、行列型にを使用することはお勧めできません。つまり、行列を値で返したくないので、非常にコストのかかる行列のコピーが発生します。これが、私の実装でmultiply、オーバーロードする代わりにメソッドを定義することを選択した理由です。operator*()

の効率的な代替手段は、operator*()を定義して次のoperator*=()ように使用することです。乗算の結果は A に直接格納されます。

A *= B; // or A = A*B 
于 2012-12-15T16:59:01.307 に答える