📄 matrix.h
字号:
#ifndef Matrix_
#define Matrix_
#include "xcept.h"
template<class T>
class Matrix {
friend ostream& operator<<
(ostream&, const Matrix<T>&);
public:
Matrix(int r = 0, int c = 0);
Matrix(const Matrix<T>& m); // copy constructor
~Matrix() {delete [] element;}
int Rows() const {return rows;}
int Columns() const {return cols;}
T& operator()(int i, int j) const;
Matrix<T>& operator=(const Matrix<T>& m);
Matrix<T> operator+() const; // unary +
Matrix<T> operator+(const Matrix<T>& m) const;
Matrix<T> operator-() const; // unary minus
Matrix<T> operator-(const Matrix<T>& m) const;
Matrix<T> operator*(const Matrix<T>& m) const;
Matrix<T>& operator+=(const T& x);
private:
int rows, cols; // matrix dimensions
T *element; // element array
};
template<class T>
Matrix<T>::Matrix(int r, int c)
{// Matrix constructor.
// validate r and c
if (r < 0 || c < 0) throw BadInitializers();
if ((!r || !c) && (r || c))
throw BadInitializers();
// create the matrix
rows = r; cols = c;
element = new T [r * c];
}
template<class T>
Matrix<T>::Matrix(const Matrix<T>& m)
{// Copy constructor for matrices.
// create matrix
rows = m.rows; cols = m.cols;
element = new T [rows * cols];
// copy each element of m
for (int i = 0; i < rows * cols; i++)
element[i] = m.element[i];
}
template<class T>
Matrix<T>& Matrix<T>::operator=(const Matrix<T>& m)
{// Assignment. (*this) = m.
if (this != &m) {// do not copy to self
delete [] element;
rows = m.rows; cols = m.cols;
element = new T [rows * cols];
// copy each element
for (int i = 0; i < rows * cols; i++)
element[i] = m.element[i];
}
return *this;
}
template<class T>
T& Matrix<T>::operator()(int i, int j) const
{// Return a reference to element (i,j).
if (i < 1 || i > rows || j < 1
|| j > cols) throw OutOfBounds();
return element[(i - 1) * cols + j - 1];
}
template<class T>
Matrix<T> Matrix<T>::
operator+(const Matrix<T>& m) const
{// Return w = (*this) + m.
if (rows != m.rows || cols != m.cols)
throw SizeMismatch();
// create result matrix w
Matrix<T> w(rows, cols);
for (int i = 0; i < rows * cols; i++)
w.element[i] = element[i] + m.element[i];
return w;
}
template<class T>
Matrix<T> Matrix<T>::
operator-(const Matrix<T>& m) const
{// Return (*this) - m.
if (rows != m.rows || cols != m.cols)
throw SizeMismatch();
// create result matrix w
Matrix<T> w(rows, cols);
for (int i = 0; i < rows * cols; i++)
w.element[i] = element[i] - m.element[i];
return w;
}
template<class T>
Matrix<T> Matrix<T>::operator-() const
{// Return w = -(*this).
// create result matrix w
Matrix<T> w(rows, cols);
for (int i = 0; i < rows * cols; i++)
w.element[i] = -element[i];
return w;
}
template<class T>
Matrix<T> Matrix<T>::
operator*(const Matrix<T>& m) const
{// Matrix multiply. Return w = (*this) * m.
if (cols != m.rows) throw SizeMismatch();
Matrix<T> w(rows, m.cols); // result matrix
// define cursors for *this, m, and w
// and initialize to location of (1,1)
int ct = 0, cm = 0, cw = 0;
// compute w(i,j) for all i and j
for (int i = 1; i <= rows; i++) {
// compute row i of result
for (int j = 1; j <= m.cols; j++) {
// compute first term of w(i,j)
T sum = element[ct] * m.element[cm];
// add in remaining terms
for (int k = 2; k <= cols; k++) {
ct++; // next term in row i of *this
cm += m.cols; // next in column j of m
sum += element[ct] * m.element[cm];
}
w.element[cw++] = sum; // save w(i,j)
// reset to start of row and next column
ct -= cols - 1;
cm = j;
}
// reset to start of next row and first column
ct += cols;
cm = 0;
}
return w;
}
template<class T>
Matrix<T>& Matrix<T>::operator+=(const T& x)
{// Increment all elements of *this by x.
for (int i = 0; i < rows * cols; i++)
element[i] += x;
return *this;
}
template<class T>
ostream& operator<<(ostream& out,
const Matrix<T>& x)
{// Put matrix x into the stream out.
// One row per line.
int k = 0; // index into element array
for (int i = 0; i < x.rows; i++) {
// do row i
for (int j = 0; j < x.cols; j++)
out << x.element[k++] << " ";
// row i finished
out << endl;}
return out;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -