首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 矩陣乘法數組未初始化導致結果隨機值:經典錯誤與修正

     編輯:程式設計綜合問答

錯誤代碼

int ar3[2][2]; // 未初始化,內容為隨機垃圾值
for (i = 0; i < 2; i++)
    for (j = 0; j < 2; j++)
        for (k = 0; k < c; k++)
            ar3[i][j] += ar1[i][k] * ar2[k][j]; // += 在垃圾值上累加

根本原因

C++ **局部數組不自動初始化**,`ar3` 佔用棧內存,內容為殘留隨機位模式。`+=` 直接在隨機值上累加,結果完全不可預期。

修正方法 (三選一)

方法代碼適用場景
定義時零初始化 `int ar3[2][2] = {};` 或 `int ar3[2][2] = {0};` 最簡潔、C++11 保證全零、零開銷
`memset` 清零 `memset(ar3, 0, sizeof(ar3));` C 風格、大數組、需兼容 C 編譯器
`std::fill` / `std::array` `std::fill(&ar3[0][0], &ar3[0][0]+4, 0);`
或用 `std::array,2> ar3{};`
現代 C++、泛型算法、類型安全

完整修正版 (含輸入參數化)

#include 
#include 

using Matrix2x2 = std::array, 2>;

Matrix2x2 multiply(const Matrix2x2& A, const Matrix2x2& B) {
    Matrix2x2 C{}; // 聚合初始化為 0 (C++11)
    for (int i = 0; i < 2; ++i)
        for (int j = 0; j < 2; ++j)
            for (int k = 0; k < 2; ++k)
                C[i][j] += A[i][k] * B[k][j];
    return C;
}

int main() {
    Matrix2x2 ar1 = {{{2, 0}, {1, 0}}};
    Matrix2x2 ar2 = {{{1, 2}, {0, 0}}};
    Matrix2x2 ar3 = multiply(ar1, ar2);

    for (const auto& row : ar3) {
        for (int val : row) std::cout << val << '\t';
        std::cout << '\n';
    }
    // 輸出:
    // 2	4
    // 1	2
}

延伸:矩陣乘法優化與庫推薦

  • Strassen 算法:O(n^2.807) 遞歸分治,大矩陣 (n>100) 有效。
  • BLAS / OpenBLAS / MKL:`cblas_sgemm` / `dgemm` 手優化 SIMD、多線程、緩存分塊,生產環境首選。
  • Eigen / Armadillo / xtensor:C++ 模板庫,語法 `C = A * B`,編譯期優化表達式模板,性能逼近 BLAS。
  • GPU 加速:cuBLAS (CUDA)、ROCm、SYCL/oneAPI 跨平台異構計算。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved