C++实现对象化矩阵乘法示例
本文展示如何利用 C++ 的面向对象特性封装矩阵运算,重点讲解如何通过类成员函数管理二维数组以及使用引用传参完成矩阵相乘的核心逻辑,适合复习线代算法与 C++ 基础。
目标与准备
本示例旨在实现一个基于类的矩阵乘法工具。主要包含两个部分:
- 数据封装:使用
juzhen类存储矩阵尺寸、元素值及名称。 - 运算逻辑:独立于类的
sum函数,处理复杂的行列索引循环。
环境要求:支持标准 C++11 及以上的编译器(如 GCC, Clang, MSVC)。
核心算法原理
矩阵相乘的本质是线性代数中的向量点积推广。对于矩阵 $A$ ($m \times s$) 和矩阵 $B$ ($s \times n$),结果矩阵 $C$ ($m \times n$) 中的每个元素 $c_{ij}$ 计算公式如下:
c[i][j] = Σ (a[i][k] * b[k][j])
其中 $k$ 从 1 遍历到 $s$。在代码实现中,需要三层循环:
1. 外层两重循环控制结果矩阵的行 i 和列 j。
2. 内层循环控制累加因子 k。
代码实现步骤
第1步:定义矩阵类结构
首先定义 juzhen 类,采用私有变量隐藏内部存储细节,提供公共接口进行初始化和读写。
- 成员变量:
m和n记录长宽;num[10][10]为固定大小的存储区(示例用途);name用于标识。 - 初始化:
size()设置维度;set()接收用户输入并填充数组。 - 访问器:
read()读取元素;write()写入元素;m1()/n1()获取尺寸。 - 展示:
display()按格式打印矩阵。
class juzhen
{
private:
int m,n;//长宽
int num[10][10] = {0};//默认初始化为0
string name;
public:
void size(int a,int b)
{ m = a; n = b; }
void set()
{
cout << "此矩阵规模:" << this->m <<","<< this->n << endl;
for (int i = 1; i <= this->m; i++)
for (int j = 1; j <= this->n; j++)
{
cin >> this->num[i][j];
}
cout << "输入完成"<< endl;
}
void display()
{
for (int i = 1; i <= this->m; i++)
for (int j = 1; j <= this->n; j++)
{
cout << this->num[i][j] << " ";
if (j == this->n) cout << endl;
}
}
//...其他 getter/setter 方法略...
};
第2步:实现矩阵乘法逻辑
这是最关键的步骤。注意函数签名为 void sum(juzhen a, juzhen b, juzhen &c)。
重点参数说明:
前两个参数 a, b 按值传递即可,因为它们只读;但结果 c 必须使用引用 &c,否则对 c 的修改不会影响到主调函数中的实参对象。
循环逻辑拆解:
- i 循环:遍历 A 的行数 (
a.m1())。 - j 循环:遍历 B 的列数 (
b.n1())。 - k0 循环:执行“行乘列”。累加
A[i][k0] * B[k0][j]至临时变量s。 - 赋值:内层循环结束后,将总和
s写入 C 的[i][j]位置,并重置s=0(在修正后的代码中移至内层起始处更佳)。
void sum(juzhen a, juzhen b, juzhen &c)//矩阵相乘公式所在
{
// 确保在每次计算新元素前清零
for (int i = 1; i <= a.m1(); i++)//A矩阵的M
for (int j = 1; j <= b.n1(); j++)//B矩阵的S
{
int s = 0; // 关键点:在此处初始化累加器
for (int k0 = 1; k0 <= a.n1(); k0++)//a.n1也就是b.m1(a的n,b的n)
{
s += a.read(i,k0)*b.read(k0,j);
}
c.write(i, j, s);
}
}
第3步:主程序流程
在 main 中实例化三个矩阵对象 A, B, C。根据数学规则,若 A 为 $m \times s$,B 为 $s \times n$,则 C 必为 $m \times n$。程序依次调用设置尺寸、输入数值、执行乘法并显示结果。
运行样例
假设输入单位矩阵进行验证:
1 0
0 1
*
1 0
0 1
=
1 0
0 1
上述操作展示了两个 2x2 矩阵的乘法过程,具体界面交互如图所示:
总结与提示
该小程序虽然简单,但涵盖了 C++ 学习中几个重要概念:
1. 类的设计:如何平衡公有接口与私有数据。
2. 引用 (&) 的使用:在处理大型对象或需修改实参时,比指针更安全且简洁。
3. 多维数组索引:理解行优先存储下的坐标对应关系。
以上就是C++实现对象化的矩阵相乘小程序的详细内容,更多关于C++面向对象编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









