实现了矩阵的生成、乘法运算。
1.完整代码如下:
#include <iostream>
#include <cstring>
#include <chrono>
#include <vector>
using namespace std;
struct Matrix
{
vector<vector<int>> M;
size_t Rows;
size_t Columns;
Matrix(size_t r = 0,size_t c=0,int rv = 1)
{
Rows = r;
Columns = c;
for (size_t i = 0; i < r; i++)
{
vector<int> t;
for (size_t j = 0; j < c; j++)
{
if (rv > 1)
{
t.push_back(rand() % rv);
}
t.push_back(rv);
}
M.push_back(t);
}
}
bool isNull()
{
return Rows == 0 || Columns == 0;
}
void printMatrix(const char* msg = "")
{
if (strlen(msg)>0)
{
printf("%s\n", msg);
}
for (size_t i = 0; i < Rows; i++)
{
for (size_t j = 0; j < Columns; j++)
printf("%d,",M[i][j]);
printf("\n");
}
}
};
// A*B
Matrix mulMatrix(Matrix a, Matrix b)
{
if (a.isNull() || b.isNull())
{
printf("空矩阵\n");
// 此处直接返回一个空的Matrix,也就是0行0列的矩阵
return Matrix();
}
if (a.Columns != b.Rows)
{
printf("不符合乘法要求的矩阵");
// 此处直接返回一个空的Matrix,也就是0行0列的矩阵
return Matrix();
}
//如果符合要求,构建一个结果矩阵
Matrix c(a.Rows, b.Columns);
for (size_t i = 0; i < a.Rows; i++)
{
for (size_t j = 0; j < b.Columns; j++)
{
//在进行默认构建时,所有矩阵中的数据全为1,所以此处需要进行置0
c.M[i][j] = 0;
for (size_t k = 0; k < a.Columns; k++)
{
c.M[i][j] += a.M[i][k] * b.M[k][j];
}
}
}
return c;
}
int main(int argc, char **argv)
{
std::cout << "开始执行矩阵运算:(输入0退出程序)" << endl;
while (true)
{
std::cout << "请输入矩阵的阶数:" << endl;
int len = 0;
cin >> len;
cout << "您输入的矩阵阶数为:" << len << endl;
if (len < 1)
{
cout << "无效的阶数:" << len << endl;
return 0;
}
Matrix Ma(len, len, 10);
//Ma.printMatrix("随机生成的方阵Ma如下:");
Matrix Mb(len, 1, 10);
//Mb.printMatrix("随机生成的列向量Mb如下:");
auto t1 = chrono::steady_clock::now();
Matrix Mc = mulMatrix(Ma, Mb);
auto t2 = chrono::steady_clock::now();
double timeSpan = chrono::duration<double, std::milli>(t2 - t1).count();
printf("总用时为:%f ms", timeSpan);
//Mc.printMatrix("----------Ma*Mb的结果如下:----------");
}
return 0;
}
2.后期的扩展方向:
- 将结构体封装为一个类,
- 编写其他的矩阵操作函数
- 运算符的重构