C++ 中的兩個矩陣相乘

Jinku Hu 2023年10月12日
C++ 中的兩個矩陣相乘

本文將介紹幾種在 C++ 中如何將兩個矩陣相乘的方法。

在 C++ 中使用序列實現兩個矩陣相乘

矩陣乘法是廣泛的工程解決方案中最常用的運算之一。因此,存在各種演算法來提高不同硬體平臺上的效能。這些演算法通常利用併發程式設計以及矩陣平鋪來加速矩陣乘法。不過,在這種情況下,我們實現了一種簡單的演算法,該演算法無需任何顯式優化即可連續執行。

首先,我們需要實現一些實用程式功能,以幫助分配和初始化要使用的矩陣。請注意,我們正在執行程式碼,以便程式設計師可以修改 ROWCOL 常量整數以指定矩陣尺寸。allocateMatrix 函式分配陣列,並用零值初始化元素。接下來,呼叫 initilizeMatrix 函式,該函式生成範圍為 [0, 100) 的隨機數,並將其儲存為矩陣元素。注意,還有一個函式可以將矩陣元素列印到 cout 流中,以驗證計算結果。

multiplyMatrix 函式實現了一個簡單的三巢狀 for 迴圈,以將兩個矩陣相乘並將結果儲存在預分配的第三個矩陣中。結果矩陣尺寸取自第一矩陣行和第二矩陣列。請注意,迴圈順序對於乘法效能非常重要。例如,如果我們在中間移動最裡面的 for 語句,則可以保證幾乎可以保證效能提高。效能的提高是由於幾乎每個現代 CPU 中都裝有快取記憶體。快取記憶體記憶體比主記憶體快,並且在檢索資料時它會儲存連續的記憶體塊。因此,下一次資料檢索可以從快取本身進行服務。

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::setw;
using std::vector;

constexpr int ROW = 2;
constexpr int COL = 3;

void initilizeMatrix(int **m, int row, int col) {
  for (auto i = 0; i < row; ++i) {
    for (auto j = 0; j < col; ++j) {
      m[i][j] = rand() % 100;
    }
  }
}

void printMatrix(int **m, int row, int col) {
  for (auto i = 0; i < row; ++i) {
    for (auto j = 0; j < col; ++j) {
      cout << setw(5) << m[i][j] << "; ";
    }
    cout << endl;
  }
}

int **allocateMatrix(int row, int col) {
  int **matrix = new int *[row];
  for (int i = 0; i < row; ++i) {
    matrix[i] = new int[col]{0};
  }
  return matrix;
}

int deallocateMatrix(int **matrix, int row) {
  for (int i = 0; i < row; ++i) {
    delete matrix[i];
  }
  delete[] matrix;
  return 0;
}

int **multiplyMatrix(int **m1, int row1, int col1, int **m2, int row2,
                     int col2) {
  if (col1 != row2) return nullptr;

  auto ret = allocateMatrix(row1, col2);

  int i, j, k;

  for (i = 0; i < row1; i++) {
    for (j = 0; j < col2; j++) {
      for (k = 0; k < col1; k++) {
        ret[i][j] += m1[i][k] * m2[k][j];
      }
    }
  }

  return ret;
}

int main() {
  int **matrix1 = allocateMatrix(ROW, COL);
  int **matrix2 = allocateMatrix(COL, ROW);

  initilizeMatrix(matrix1, ROW, COL);
  initilizeMatrix(matrix2, COL, ROW);

  printMatrix(matrix1, ROW, COL);
  cout << endl;
  printMatrix(matrix2, COL, ROW);

  auto result = multiplyMatrix(matrix1, ROW, COL, matrix2, COL, ROW);

  cout << endl;
  printMatrix(result, ROW, ROW);

  deallocateMatrix(matrix1, ROW);
  deallocateMatrix(matrix2, COL);
  deallocateMatrix(result, ROW);

  return EXIT_SUCCESS;
}

輸出:

83;    86;    77;
15;    93;    35;

86;    92;
49;    21;
62;    27;

16126; 11521;
8017;  4278;

最後,重要的是在程式退出之前釋放矩陣使用的所有記憶體資源。實現了 deallocateMatrix 函式,以便它使用矩陣指標和其中的行來刪除物件中的每個元素。注意,在 multiplyMatrix 函式作用域中分配的結果矩陣也應顯式釋放。

作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Math