C++ 怎么实现矩阵乘法 C++二维数组循环嵌套计算逻辑【练习】
技术百科
尼克
发布时间:2026-01-25
浏览: 次 矩阵乘法需三层for循环:外两层遍历结果矩阵C的行i和列j,最内层用k累加Ai*Bk,维度须满足Am×Bk=Cm,索引顺序不可颠倒。
用 for 嵌套实现 C++ 二维数组矩阵乘法
直接上手写的话,核心就是三层 for:外两层遍历结果矩阵的行和列,最内层累加对应行列的点积。注意下标别越界,且三个矩阵维度必须满足 A[m][k] × B[k][n] → C[m][n]。
常见错误是把 i、j、k 的循环顺序写反,或者在累加时用了错误的索引组合(比如写成 A[i][j] * B[j][k])。正确写法是:
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
C[i][j] = 0;
for (int k = 0; k < k_dim; ++k) {
C[i][j] += A[i][k] * B[k][j]; // 关键:A 行 × B 列
}
}
}
为什么不能用 std::vector<:vector>> 直接套用相同逻辑?
可以套用,但性能和内存布局会出问题。二维 vector 是“指针数组的数组”,每行内存不连续,CPU 缓存不友好;而原生二维数组(如 int A[100][100])或一维模拟(int* A = new int[m*k])才是连续块。
如果你坚持用 vector,务必确认:
-
A.size()和A[i].size()在每次访问前已校验,否则运行时可能崩溃 - 初始化要到位:
vector,否则> C(m, vector (n, 0)); C[i][j]可能未定义 - 别在循环里反复调用
.size(),它不是编译期常量,可提前存为变量
operator* 重载实现矩阵乘法要注意什么?
重载本身不难,但容易忽略语义一致性与资源安全。比如:
- 返回值应是新对象(非引用),否则
C = A * B会出错 - 如果类内部用裸指针管理内存(如
int* data),必须显式定义拷贝构造、赋值、析构(三法则) - 建议用
std::unique_ptr或std::vector管理数据,避免手动new/dele
te
- 维度不匹配时,抛出
std::invalid_argument比静默失败更可靠
练习时最容易卡住的三个细节
不是算法逻辑错,而是环境或习惯导致的硬伤:
- 忘记初始化结果数组——C++ 原生数组不自动清零,
C[i][j]初始值是垃圾值 - 把乘法写成
A[i][j] * B[i][j](这是逐元素乘,不是矩阵乘) - 测试用例选太小(比如 2×2),掩盖了边界错误;建议至少试一组
3×2 × 2×4,看输出是否为3×4且数值合理
矩阵乘法看着简单,但下标、内存、初始化这三块一旦松懈,调试起来比算法本身还花时间。
# ai
# 才是
# 这是
# 如果你
# 看着
# 要注意
# 循环
# 对象
# c++
# int
# 指针
# 为什么
# delete
# operator
# 算法
# 遍历
# for
# 不能用
# 常量
# 两层
# 太小
# 要到
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python项目维护经验_长期演进说明【指导】
- Win11怎么设置默认邮件客户端 Win11修改M
- 如何使用Golang开发简单的聊天室消息存储_Go
- 如何在 Go 中高效缓存与分发网络视频流
- Mac如何创建和管理多个桌面空间_Mac高效多任务
- Win11怎么更改系统语言为中文_Windows1
- Win11怎么更改电脑密码_Windows 11修
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- Linux怎么禁止Root用户远程登录_Linux
- php485支持哪些操作系统_php485跨系统支
- 如何使用Golang实现容器安全扫描_Golang
- php中::能访问全局变量吗_全局作用域与类作用域
- 作用域操作符会影响性能吗_php静态调用性能分析【
- Windows 10怎么把任务栏放在屏幕上方_Wi
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- Windows7怎么找回经典开始菜单_Window
- 如何使用Golang搭建Web开发环境_快速启动H
- 如何在Golang中优化文件读写性能_使用缓冲和并
- Win10电脑C盘红了怎么清理_Windows10
- Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱
- Win11如何设置自动关机 Win11定时关机命令
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- PythonWeb前后端整合项目教程_FastAP
- mac本地php环境如何开启curl_curl扩展
- 如何用正则表达式精确匹配“start”到“end”
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- php8.4匿名类怎么用_php8.4匿名类创建与
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- Windows10蓝屏代码DPC_WATCHDOG
- Win10文件历史记录怎么用 Win10开启自动备
- Win10怎样安装Word样式库_Win10安装W
- Mac如何设置动态壁纸?(让桌面动起来)
- Python性能剖析高级教程_cProfileLi
- Win11右键反应慢怎么办 Win11优化右键菜单
- Windows蓝屏BAD_POOL_HEADER故
- Win11怎么开启自动HDR画质_Windows1
- Win11怎么恢复误删照片_Win11数据恢复工具
- Go语言中slice追加操作的底层共享机制解析
- 如何在 Windows 11 中使用 AlomWa
- php转exe用什么工具打包快_高效打包软件推荐【
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- Win11怎么检查TPM2.0模块_Windows
- Win10怎么关闭自动更新错误重启 Win10策略
- Win11怎么更改账户头像_Windows 11自
- 如何使用Golang开发基础文件下载功能_Gola
- Win11怎么关闭OneDrive同步_Win11
- Windows 10怎么录屏_Windows 10
- Python网络异常模拟_测试说明【指导】
- 如何使用Golang实现负载均衡_分发请求到多个服
- 如何使用 Selenium 正确获取篮球参考网站球


QQ客服