数组和矩阵
- 行主映射:从第一行开始,依次对每一行的索引从左至右连续编号。
- 列主映射:从最左开始,依次对每一列的索引从上到下连续编号。
- 不规则二维数组:二维数组有两行或更多行,其元素个数不等。
矩阵:
一个 m * n 矩阵是一个m行,n列的表。m、n是矩阵的维数。
矩阵类声明:
template<class T>
class matrix
{
friend ostream& operator<<(ostream&, const matrix<T>&);
public:
matrix(int theRows = 0, int theColumns = 0);
matrix(const matrix<T>&);
~matrix() {delete [] element;}
int rows() const {return theRows;}
int columns() const {return theColumns;}
T& operator()(int i, int j) const;
matrix<T>& operator=(const matrix<T>&);
matrix<T> operator+() const; // unary +
matrix<T> operator+(const matrix<T>&) const;
matrix<T> operator-() const; // unary minus
matrix<T> operator-(const matrix<T>&) const;
matrix<T> operator*(const matrix<T>&) const;
matrix<T>& operator+=(const T&);
private:
int theRows, // number of rows in matrix
theColumns; // number of columns in matrix
T *element; // element array
};
方法实现:
构造函数:
template<class T>
matrix<T>::matrix(int theRows, int theColumns)
{
if (theRows < 0 || theColumns < 0)
throw illegalParameterValue("Rows and columns must be >= 0");
if ((theRows == 0 || theColumns == 0)
&& (theRows != 0 || theColumns != 0))
throw illegalParameterValue
("Either both or neither rows and columns should be zero");
// create the matrix
this->theRows = theRows;
this->theColumns = theColumns;
element = new T [theRows * theColumns];
}
拷贝构造函数:
template<class T>
matrix<T>::matrix(const matrix<T>& m)
{// Copy constructor for matrices.
// create matrix
theRows = m.theRows;
theColumns = m.theColumns;
element = new T [theRows * theColumns];
// copy each element of m
copy(m.element,
m.element + theRows * theColumns,
element);
}
赋值运算符=重载:
template<class T>
matrix<T>& matrix<T>::operator=(const matrix<T>& m)
{// Assignment. (*this) = m.
if (this != &m)
{// not copying to self
delete [] element;
theRows = m.theRows;
theColumns = m.theColumns;
element = new T [theRows * theColumns];
// copy each element
copy(m.element,
m.element + theRows * theColumns,
element);
}
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 > theRows
|| j < 1 || j > theColumns)
throw matrixIndexOutOfBounds();
return element[(i - 1) * theColumns + j - 1];
}
矩阵加法:
template<class T>
matrix<T> matrix<T>::operator+(const matrix<T>& m) const
{// Return w = (*this) + m.
if (theRows != m.theRows
|| theColumns != m.theColumns)
throw matrixSizeMismatch();
// create result matrix w
matrix<T> w(theRows, theColumns);
for (int i = 0; i < theRows * theColumns; 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 (theRows != m.theRows
|| theColumns != m.theColumns)
throw matrixSizeMismatch();
// create result matrix w
matrix<T> w(theRows, theColumns);
for (int i = 0; i < theRows * theColumns; 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(theRows, theColumns);
for (int i = 0; i < theRows * theColumns; 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 (theColumns != m.theRows)
throw matrixSizeMismatch();
matrix<T> w(theRows, m.theColumns); // result matrix
// define cursors for *this, m, and w
// and initialize to location of (1,1) element
int ct = 0, cm = 0, cw = 0;
// compute w(i,j) for all i and j
for (int i = 1; i <= theRows; i++)
{// compute row i of result
for (int j = 1; j <= m.theColumns; j++)
{ // compute first term of w(i,j)
T sum = element[ct] * m.element[cm];
// add in remaining terms
for (int k = 2; k <= theColumns; k++)
{
ct++; // next term in row i of *this
cm += m.theColumns; // 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 -= theColumns - 1;
cm = j;
}
// reset to start of next row and first column
ct += theColumns;
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 < theRows * theColumns; i++)
element[i] += x;
return *this;
}
输出:
template<class T>
ostream& operator<<(ostream& out, const matrix<T>& m)
{// Put matrix m into the stream out.
// One row per line.
int k = 0; // index into element array
for (int i = 0; i < m.theRows; i++)
{// do row i
for (int j = 0; j < m.theColumns; j++)
out << m.element[k++] << " ";
// row i finished
out << endl;
}
return out;
}
特殊矩阵:
- 方阵:行和列数相同的矩阵。
- 对角阵:当 i 不等于 j 时,元素均为0;
- 三对角阵:当|i- j| > 1时,元素均为0;
- 下三角阵:
- 上三角阵:
- 对称矩阵:
- 稀疏矩阵:一个m * n 的矩阵,如果大多数元素为0,则称为稀疏矩阵。
具体实现:见github链接:源码