0

0

c++中如何实现矩阵乘法_c++二维数组矩阵相乘逻辑

冰火之心

冰火之心

发布时间:2026-01-09 15:20:02

|

360人浏览过

|

来源于php中文网

原创

矩阵乘法必须首先检查左矩阵列数等于右矩阵行数,否则应抛出std::invalid_argument异常;使用std::vector时需确保非空且每行长度一致,推荐一维vector模拟二维以提升缓存友好性。

c++中如何实现矩阵乘法_c++二维数组矩阵相乘逻辑

矩阵乘法的维度合法性检查必须放在最前面

两个矩阵能相乘的前提是:左矩阵的列数等于右矩阵的行数。不检查就直接计算,轻则结果全错,重则访问越界崩溃。std::vector 或裸 int** 都不会自动做这个判断,得自己写。

  • 假设左矩阵 Am x k,右矩阵 Bk x n,结果 C 应为 m x n
  • A 列数 ≠ B 行数,应立刻返回错误或抛异常(比如 std::invalid_argument
  • 用裸数组时,这个信息通常靠传参显式带入,例如:multiply(A, m, k, B, k, n, C)

std::vector<:vector>> 实现更安全但要注意性能陷阱

动态二维 vector 写起来直观,但默认初始化和内存布局可能拖慢乘法——尤其是大矩阵。每行是独立分配的,缓存不友好。

std::vector> multiply(const std::vector>& A,
                                        const std::vector>& B) {
    int m = A.size(), k = A[0].size();
    int n = B[0].size();
    if (k != (int)B.size()) throw std::invalid_argument("Dimension mismatch");
std::vector> C(m, std::vector(n, 0));
for (int i = 0; i < m; ++i)
    for (int j = 0; j < n; ++j)
        for (int p = 0; p < k; ++p)
            C[i][j] += A[i][p] * B[p][j];
return C;

}

  • 注意:A[0].size() 前要确保 A 非空且每行长度一致,否则行为未定义
  • 三层循环顺序固定为 i→j→p(不是 i→p→j),这对现代 CPU 缓存更友好
  • 如果矩阵很大,建议改用一维 std::vector 模拟二维(行优先),避免指针跳转开销

裸二维数组(/堆)需手动管理尺寸,容易越界

int A[100][100]int** A 时,编译器不检查 A[i][j] 是否合法。下标错一位,可能读到相邻变量甚至段错误。

TemPolor
TemPolor

AI音乐生成器,一键创作免版税音乐

下载

立即学习C++免费学习笔记(深入)”;

  • 栈数组如 int A[3][4], B[4][5]; 可直接用,但尺寸必须编译期确定
  • 堆分配 int** A = new int*[m]; for(...) A[i] = new int[k]; 要配对 delete[],否则泄漏
  • 推荐用 std::unique_ptr 管理: auto A = std::make_unique<:unique_ptr>[]>(m);

常见错误:混淆行列索引或累加逻辑

最容易写错的是内层累加没清零,或者把 A[i][p] * B[p][j] 错写成 A[i][j] * B[i][j]——那根本不是矩阵乘法,而是逐元素乘。

  • 结果矩阵 C[i][j] 必须初始化为 0,否则含垃圾值
  • 中间求和变量不能复用上一轮的残留值(尤其用单个 sum 变量时)
  • 调试时可先用 2×2 小矩阵手算验证:比如 A={{1,2},{3,4}}, B={{0,1},{1,0}},结果应为 {{2,1},{4,3}}

实际工程中,小矩阵用 vector 足够;高频/大矩阵务必考虑内存连续性、SIMD 指令或 Eigen 等库。手写时,维度检查和索引边界永远比优化循环更重要。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

532

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

51

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

567

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

567

2023.08.10

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号