Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Định thức ma trận (Determinant of Matrix) trong C++

Định thức (Determinant) là một giá trị số tính được từ ma trận vuông, quan trọng trong đại số tuyến tính (giải hệ phương trình, nghịch đảo ma trận, diện tích/thể tích).

Công thức (Khai triển Laplace theo hàng đầu)

Với ma trận n x n:
det(A) = Σ (-1)^(j) * a[0][j] * det(Minor(0, j)) (j chạy 0..n-1).

Minor(i, j) là ma trận con được bằng cách xóa hàng i và cột j.

Chương trình C++ (Đệ quy + Tạo Minor)

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

using Matrix = vector<vector<double>>;

// Tạo ma trận con (Minor) bằng cách bỏ hàng p, cột q
Matrix getMinor(const Matrix& mat, int p, int q) {
    int n = mat.size();
    Matrix minor(n-1, vector<double>(n-1));
    int r = 0, c = 0;
    for (int i = 0; i < n; i++) {
        if (i == p) continue;
        c = 0;
        for (int j = 0; j < n; j++) {
            if (j == q) continue;
            minor[r][c++] = mat[i][j];
        }
        r++;
    }
    return minor;
}

double determinant(const Matrix& mat) {
    int n = mat.size();
    if (n == 1) return mat[0][0];
    if (n == 2) return mat[0][0]*mat[1][1] - mat[0][1]*mat[1][0]; // Base case nhanh
    
    double det = 0;
    int sign = 1;
    for (int j = 0; j < n; j++) {
        Matrix minor = getMinor(mat, 0, j);
        det += sign * mat[0][j] * determinant(minor);
        sign = -sign; // (-1)^j
    }
    return det;
}

void printMatrix(const Matrix& mat) {
    for (auto &row : mat) {
        for (auto val : row) cout << val << "\t";
        cout << endl;
    }
}

int main() {
    Matrix mat = {
        {1, 0, 2},
        {3, 0, 0},
        {2, 1, 4}
    };
    
    cout << "Ma tran:\n"; printMatrix(mat);
    cout << "Dinh thuc: " << determinant(mat) << endl; // Output: 6
    
    // Test 4x4
    Matrix mat4 = {{1,2,3,4}, {5,6,7,8}, {9,1,2,3}, {4,5,6,7}};
    cout << "\nMa tran 4x4 dinh thuc: " << determinant(mat4) << endl;
    return 0;
}

Đầu ra

Ma tran:
1	0	2
3	0	0
2	1	4
Dinh thuc: 6

Ma tran 4x4 dinh thuc: -120

Lưu ý hiệu năng: Đệ quy khai triển Laplace có độ phức tạp O(N!), chỉ dùng cho ma trận nhỏ (N ≤ 10). Với ma trận lớn, dùng **Khử Gauss (Gaussian Elimination)** O(N³) hoặc **Phân rã LU**.