C++实现关系矩阵乘法(附带源码)
一、项目背景详细介绍
2. 关系矩阵的运算意义
关系矩阵不仅是集合关系的静态表示,更是逻辑运算的基础。
常见运算包括:
-
关系的并、交;
-
关系的复合(composition);
-
关系的逆;
-
关系的传递闭包。
矩阵乘法 就是其中最核心的一种运算,用来表示关系的复合(composition)。
4. 应用场景
-
数据库:关系复合对应于连接操作;
-
图论:关系矩阵表示邻接关系,乘法表示路径可达性;
-
人工智能:知识推理中的关系传播;
-
网络安全:访问控制矩阵;
-
离散数学:集合关系计算与验证。
5. 项目目标
实现一个完整的 C++ 程序:
-
输入两个布尔矩阵;
-
计算并输出关系矩阵的乘积(关系复合);
-
支持任意大小;
-
可扩展到普通数值矩阵乘法;
-
具备详细教学注释。
二、项目需求详细介绍
1. 功能性需求
-
支持输入两个矩阵 A 与 B;
-
检查维度匹配(A 的列数 = B 的行数);
-
实现关系矩阵乘法逻辑:
-
使用逻辑“与”对应乘法;
-
使用逻辑“或”对应加法;
-
-
输出乘积矩阵。
三、相关技术详细介绍
1. 普通矩阵乘法回顾
对于普通矩阵:

该运算基于算术乘法与加法。
2. 关系矩阵乘法逻辑
关系矩阵使用逻辑运算:

}
3. 数据结构选型
使用 std::vector<std::vector<int>> 作为二维矩阵容器,便于动态扩展与安全访问。
4. 输入验证与鲁棒性
-
检查行列维度匹配;
-
检查输入是否为0或1;
-
矩阵元素存储为
int类型(仅取0或1)。
四、实现思路详细介绍
-
输入阶段
-
用户输入矩阵维度;
-
输入布尔矩阵内容。
-
-
合法性检查
-
若矩阵维度不匹配(A的列 != B的行),报错退出。
-
-
计算阶段
-
三重循环实现逻辑与/或矩阵乘法。
-
-
输出阶段
-
打印结果矩阵;
-
可选保存到文件。
-
五、完整实现代码
/***********************************************************************
* 文件名: relation_matrix_multiply.cpp
* 功能: 实现关系矩阵乘法(逻辑乘法)
* 作者: 曹磊教学版
* 编译:
* g++ -std=c++17 -O2 -Wall -o relation relation_matrix_multiply.cpp
* 运行:
* ./relation
***********************************************************************/
#include <iostream>
#include <vector>
#include <iomanip>
// 打印矩阵函数
void printMatrix(const std::vector<std::vector<int>>& M, const std::string& name) {
std::cout << "\n矩阵 " << name << " :" << std::endl;
for (const auto& row : M) {
for (int val : row)
std::cout << std::setw(3) << val;
std::cout << std::endl;
}
}
// 关系矩阵乘法(逻辑运算)
std::vector<std::vector<int>> relationMultiply(
const std::vector<std::vector<int>>& A,
const std::vector<std::vector<int>>& B)
{
int m = A.size(); // A 的行数
int n = A[0].size(); // A 的列数 == B 的行数
int p = B[0].size(); // B 的列数
std::vector<std::vector<int>> C(m, std::vector<int>(p, 0));
// 三重循环:逻辑乘法(与/或)
for (int i = 0; i < m; ++i) {
for (int j = 0; j < p; ++j) {
int val = 0;
for (int k = 0; k < n; ++k) {
val = val || (A[i][k] && B[k][j]);
}
C[i][j] = val;
}
}
return C;
}
int main() {
int m, n, p;
std::cout << "请输入矩阵A的行数和列数 (m n): ";
std::cin >> m >> n;
std::cout << "请输入矩阵B的列数 (p): ";
std::cin >> p;
std::vector<std::vector<int>> A(m, std::vector<int>(n));
std::vector<std::vector<int>> B(n, std::vector<int>(p));
std::cout << "请输入矩阵A (" << m << "x" << n << ") 元素(0或1):" << std::endl;
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
std::cin >> A[i][j];
std::cout << "请输入矩阵B (" << n << "x" << p << ") 元素(0或1):" << std::endl;
for (int i = 0; i < n; ++i)
for (int j = 0; j < p; ++j)
std::cin >> B[i][j];
// 打印输入矩阵
printMatrix(A, "A");
printMatrix(B, "B");
// 计算关系矩阵乘法
auto C = relationMultiply(A, B);
printMatrix(C, "A∘B (关系乘积)");
return 0;
}
六、代码详细解读
| 函数/变量名 | 作用 |
|---|---|
printMatrix() |
打印二维矩阵内容。 |
relationMultiply() |
实现关系矩阵乘法逻辑。 |
| `val = val | |
main() |
程序入口,负责输入、计算与输出。 |
std::vector<std::vector<int>> |
动态二维矩阵容器。 |
std::setw(3) |
控制输出对齐格式。 |
七、项目详细总结
本项目从离散数学关系矩阵理论出发,完整实现了 关系矩阵的逻辑乘法(复合关系)。
-
✅ 算法意义:体现了逻辑与集合复合思想;
-
✅ 工程意义:为数据库、图论分析提供底层实现;
-
✅ 实现难度适中:三重循环逻辑直观、适合教学演示。
通过本程序,学生可以:
-
理解关系复合的定义;
-
学会将逻辑运算映射到矩阵运算;
-
掌握 C++ 中二维数组/向量操作;
-
培养从数学模型到代码实现的抽象能力。
八、项目常见问题及解答(FAQ)
Q1:为什么不用普通乘法?
A1:关系矩阵乘法基于逻辑,而不是算术。因此用 && 和 || 代替 * 和 +。
Q2:结果矩阵可能大于1吗?
A2:不会。因为 && 与 || 仅产生 0 或 1。
Q3:矩阵维度不匹配怎么办?
A3:A的列数必须等于B的行数,否则无法进行乘法。
Q4:能否扩展为普通数值矩阵乘法?
A4:可以,只需将逻辑运算替换为 * 与 +。
Q5:能否实现稀疏矩阵版本?
A5:可以使用 unordered_map 存储稀疏关系,减少运算开销。
更多推荐


所有评论(0)