template <typename T>
matrix<T> &matrix<T>::operator = (const matrix<T> &m) // 行列 =行列
{
assert((m_row == m.m_row) && (m_col == m.m_col));

if (&m != this) {
if (m_row == 0 && m_col == 0) SetSize(m.m_row, m.m_col);

int n = m_row*m_col;
T *p1 = m_pMatrix, *p2 = m.m_pMatrix;

for (int i = 0; i < n; i++, p1++, p2++) *p1 = *p2;
}

return *this;
}

template<typename T>
matrix<T> operator * (const matrix<T> &m1, const matrix<T> &m2) // 行列×行列
{
int row1 = m1.GetRow(), col1 = m1.GetCol(), row2 = m2.GetRow(), col2 = m2.GetCol();
int n1 = row2*col2 - 1, n2 = col2*(row2 - 1);
matrix<T> m3(row1, col2);
T tmp, *p1 = m1.m_pMatrix, *p2 = m2.m_pMatrix, *p3 = m3.m_pMatrix, *p4 = p2;

assert(col1 == row2);

for (int i = 0; i < row1; i++, p1 += col1, p2 = p4) {
for (int j = 0; j < col2; j++, p1 -= col1, p2 -= n1, p3++) {
tmp = 0;
for (int k = 0; k < col1; k++, p1++, p2 += col2) {
tmp += *p1 * *p2;
}
*p3 = tmp;
}
}

return m3;
}