📄 matrix1.h
字号:
#include "xcept.h"
#include "vector.h"
template<class T>
class Matrix {
public:
Matrix(int r = 0, int c = 0);
Matrix(const Matrix<T>& m); // copy constructor
~Matrix() {delete [] row;}
T& operator[](int x) 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);
void Output(ostream& out) const;
private:
int rows, cols;
Vector<T> **row; // array of pointers
};
template<class T>
Matrix<T>::Matrix(int r, int c)
{// Create.
if (rows < 0 || cols < 0) throw BadInitializers();
if ((!rows || !cols) && (rows || cols))
throw BadInitializers();
rows = r; cols = c;
row = new Vector<T>* (c) [r];
}
template<class T>
Matrix<T>::Matrix(const Matrix<T>& m)
{// Copy constructor.
rows = m.rows; cols = m.cols;
row = new Vector<T> (cols) [rows];
// copy each row
for (int i = 0; i < rows; i++)
row[i] = m.row[i];
}
template<class T>
Matrix<T>& Matrix<T>::operator=(const Matrix<T>& m)
{// Assignment.
if (this != &m) {// not self assignment
delete [] row;
rows = m.rows; cols = m.cols;
row = new Vector<T> (cols) [rows];
// copy each row
for (int i = 0; i < rows; i++)
row[i] = m.row[i];
}
return *this;
}
template<class T>
T& Matrix<T>::operator[](int x) const
{// First index of matrix.
if (x < 1 || x > rows) throw OutOfBounds();
return *row[x - 1];
}
template<class T>
Matrix<T> Matrix<T>::operator+(const Matrix<T>& m) const
{// Add two matrices.
if (rows != m.rows || cols != m.cols)
throw SizeMismatch();
Matrix<T> w(rows, cols);
for (int i = 0; i < rows; i++)
w.row[i] = row[i] + m.row[i];
return w;
}
template<class T>
Matrix<T> Matrix<T>::operator-(const Matrix<T>& m) const
{// Subtract two matrices.
if (rows != m.rows || cols != m.cols)
throw SizeMismatch();
Matrix<T> w(rows, cols);
for (int i = 0; i < rows; i++)
w.row[i] = row[i] - m.row[i];
return w;
}
template<class T>
Matrix<T> Matrix<T>::operator-() const
{// Unary minus.
Matrix<T> w(rows, cols);
for (int i = 0; i < rows; i++)
w.row[i] = -row[i];
return w;
}
template<class T>
Matrix<T> Matrix<T>::operator*(const Matrix<T>& m) const
{// Multiply two matrices.
if (cols != m.rows) throw SizeMismatch();
Matrix<T> w(rows, m.cols);
for (int i = 1; i <= rows; i++)
for (int j = 1; j <= m.cols; j++) {
T sum = (*this)[i][1] * m[1][j];
for (int k = 1; k <= cols; k++)
sum += (*this)[i][k] * m[k][j];
w[i][j] = sum;
}
return w;
}
template<class T>
Matrix<T>& Matrix<T>::operator+=(const T& x)
{// Increment.
for (int i = 0; i < rows; i++)
row[i] += x;
return *this;
}
template<class T>
void Matrix<T>::Output(ostream& out) const
{// Put the matrix into the stream out.
for (int i = 0; i < rows; i++)
out << row[i] << endl;
}
// overload <<
template <class T>
ostream& operator<<(ostream& out, const Matrix<T>& x)
{x.Output(out); return out;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -