随机产生一个mn的100以内的正整数矩阵,输出这个矩阵,再随机产生一个no的100以内的正整数矩阵,输出这个矩阵,求这两个矩阵的乘积,放在一个新的矩阵中,输出所得矩阵。(m、n、o由键盘输入,需要判断m、n、o的合法性)
#include <iostream>
#include <random>
#include <vector>
#include <iomanip>
#include <cassert>
#include <stdexcept>
class Matrix
{
public:
typedef int value_type;
typedef std::size_t size_type;
Matrix(size_type m, size_type n) : _m(m), _n(n)
{
if (m == 0 || n == 0)
throw std::invalid_argument("invalid matrix size");
_data.resize(m * n);
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> uniform_dist(1, 100);
for (size_type i = 0; i < _data.size(); i++)
_data[i] = uniform_dist(gen);
}
size_type num_rows() const { return _m; }
size_type num_cols() const { return _n; }
value_type operator()(size_type i, size_type j) const
{
return _data[i * _n + j];
}
value_type &operator()(size_type i, size_type j)
{
return _data[i * _n + j];
}
private:
size_type _m;
size_type _n;
std::vector<value_type> _data;
};
inline Matrix operator*(const Matrix &lhs, const Matrix &rhs)
{
if (lhs.num_cols() != rhs.num_rows())
throw std::invalid_argument("matrix size mismatched");
Matrix result(lhs.num_rows(), rhs.num_cols());
for (std::size_t i = 0; i < result.num_rows(); i++)
{
for (std::size_t j = 0; j < result.num_cols(); j++)
{
int value = 0;
for (std::size_t k = 0; k < lhs.num_cols(); k++)
value += lhs(i, k) * rhs(k, j);
result(i, j) = value;
}
}
return result;
}
template <typename CharT, typename Traits>
std::basic_ostream<CharT, Traits> &operator<<(std::basic_ostream<CharT, Traits> &os, const Matrix &matrix)
{
for (std::size_t i = 0; i < matrix.num_rows(); i++)
{
os << '|';
for (std::size_t j = 0; j < matrix.num_cols(); j++)
os << std::setw(6) << matrix(i, j) << ' ';
os << "|\n";
}
return os;
}
int main()
{
std::cout << "Input m n o (>0): ";
int m, n, o;
std::cin >> m >> n >> o;
if (m <= 0 || n <= 0 || o <= 0) {
std::cerr << "invalid parameter\n";
return -1;
}
Matrix A(m, n);
Matrix B(n, o);
std::cout << "A =\n"
<< A << '\n';
std::cout << "B =\n"
<< B << '\n';
std::cout << "A * B =\n"
<< A * B << '\n';
return 0;
}