Matrix
クラスを書きました。行列間の乗算を行います。行列の乗算によって 1x1 の行列が得られる場合があります (例: 2 つの列ベクトルの内積)。Matrix
オブジェクトが1つずつあるときに、スカラー値を直接返すようにすることは可能ですか?
template <class T> class Matrix
{
public:
// ...
T& operator()(uint64_t unRow, uint64_t unCol = 0) throw(MatrixOutOfRange);
const T& operator()(uint64_t unRow, uint64_t unCol = 0) const throw(MatrixOutOfRange);
// ...
protected:
std::vector<T> MatrixArray;
// ...
};
// ...
template <class T>
T & Matrix<T>::operator()(uint64_t unRow, uint64_t unCol /*= 0*/) throw(MatrixOutOfRange)
{
/* Bound checking here */
return MatrixArray[m_unColSize * unRow + unCol];
}
template <class T>
const T & Matrix<T>::operator()(uint64_t unRow, uint64_t unCol /*= 0*/) const throw(MatrixOutOfRange)
{
/* Bound checking here */
return MatrixArray[m_unColSize * unRow + unCol];
}
// ...
コード例:
Matrix<double> A (3, 1, 1.0, 2.0, 3.0);
Matrix<double> AT(1, 3, 1.0, 2.0, 3.0); // Transpose of the A matrix
Matrix<double> B (3, 1, 4.0, 5.0, 6.0);
Matrix<double> C();
C = AT * B;
double Result1 = C(0, 0);
double Result2 = (AT * B)(0, 0);
double Result3 = A.InnerProductWith(B)(0, 0);
(0, 0)
結果が 1 行 1 列の行列の場合、不要な要素位置指定子の引数を削除したいと考えています。このような:
C = AT * B;
double Result1 = C;
double Result2 = AT * B;
double Result3 = A.InnerProductWith(B);
結果が逐一でなければ例外を投げればOKです。