3x3矩陣教程

3x3矩陣教程

1. 簡介

三維矩陣是線性代數中的重要概念,用于表示三維空間中的線性變換。本教程將介紹如何使用C++實現三維矩陣的基本運算和變換。

2. 代碼實現

2.1 頭文件 (matrix3x3.h)

#ifndef MATRIX3X3_H
#define MATRIX3X3_H#include <array>
#include <stdexcept>
#include <iostream>namespace math {
namespace linear_algebra {/*** @brief 三維矩陣類* * 這個類實現了三維矩陣的基本運算,包括:* - 矩陣加減* - 矩陣乘法* - 標量乘法* - 行列式計算* - 矩陣求逆* - 矩陣轉置* - 特征值和特征向量計算* - 矩陣性質檢查(可逆性、對稱性、正交性)* - 特殊矩陣生成(旋轉矩陣、縮放矩陣等)*/
class Matrix3x3 {
public:// 構造函數Matrix3x3();  // 默認構造函數,初始化為單位矩陣Matrix3x3(const std::array<std::array<double, 3>, 3>& data);  // 從二維數組初始化// 基本運算Matrix3x3 operator+(const Matrix3x3& other) const;  // 矩陣加法Matrix3x3 operator-(const Matrix3x3& other) const;  // 矩陣減法Matrix3x3 operator*(const Matrix3x3& other) const;  // 矩陣乘法Matrix3x3 operator*(double scalar) const;           // 標量乘法Matrix3x3 operator/(double scalar) const;           // 標量除法// 矩陣運算double determinant() const;                         // 計算行列式Matrix3x3 inverse() const;                          // 計算逆矩陣Matrix3x3 transpose() const;                        // 計算轉置矩陣std::array<double, 3> eigenvalues() const;          // 計算特征值std::array<Matrix3x3, 3> eigenvectors() const;      // 計算特征向量// 矩陣性質bool isInvertible() const;                          // 檢查是否可逆bool isSymmetric() const;                           // 檢查是否對稱bool isOrthogonal() const;                          // 檢查是否正交// 特殊矩陣static Matrix3x3 identity();                        // 創建單位矩陣static Matrix3x3 rotation(double theta, char axis); // 創建旋轉矩陣static Matrix3x3 scaling(double sx, double sy, double sz); // 創建縮放矩陣// 輸出運算符friend std::ostream& operator<<(std::ostream& os, const Matrix3x3& m);private:std::array<std::array<double, 3>, 3> data;  // 3x3矩陣數據
};} // namespace linear_algebra
} // namespace math#endif // MATRIX3X3_H

2.2 實現文件 (matrix3x3.cpp)

#include "matrix3x3.h"
#include <cmath>namespace math {
namespace linear_algebra {// 默認構造函數:初始化為單位矩陣
Matrix3x3::Matrix3x3() {for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {data[i][j] = (i == j) ? 1.0 : 0.0;}}
}// 從二維數組初始化
Matrix3x3::Matrix3x3(const std::array<std::array<double, 3>, 3>& data) : data(data) {}// 矩陣加法實現
Matrix3x3 Matrix3x3::operator+(const Matrix3x3& other) const {Matrix3x3 result;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {result.data[i][j] = data[i][j] + other.data[i][j];}}return result;
}// 矩陣減法實現
Matrix3x3 Matrix3x3::operator-(const Matrix3x3& other) const {Matrix3x3 result;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {result.data[i][j] = data[i][j] - other.data[i][j];}}return result;
}// 矩陣乘法實現
Matrix3x3 Matrix3x3::operator*(const Matrix3x3& other) const {Matrix3x3 result;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {result.data[i][j] = 0.0;for (int k = 0; k < 3; ++k) {result.data[i][j] += data[i][k] * other.data[k][j];}}}return result;
}// 標量乘法實現
Matrix3x3 Matrix3x3::operator*(double scalar) const {Matrix3x3 result;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {result.data[i][j] = data[i][j] * scalar;}}return result;
}// 標量除法實現
Matrix3x3 Matrix3x3::operator/(double scalar) const {if (scalar == 0.0) {throw std::runtime_error("Division by zero");}return *this * (1.0 / scalar);
}// 行列式計算實現
double Matrix3x3::determinant() const {return data[0][0] * (data[1][1] * data[2][2] - data[1][2] * data[2][1]) -data[0][1] * (data[1][0] * data[2][2] - data[1][2] * data[2][0]) +data[0][2] * (data[1][0] * data[2][1] - data[1][1] * data[2][0]);
}// 逆矩陣計算實現
Matrix3x3 Matrix3x3::inverse() const {double det = determinant();if (det == 0.0) {throw std::runtime_error("Matrix is not invertible");}Matrix3x3 result;double invDet = 1.0 / det;// 計算伴隨矩陣result.data[0][0] = (data[1][1] * data[2][2] - data[1][2] * data[2][1]) * invDet;result.data[0][1] = (data[0][2] * data[2][1] - data[0][1] * data[2][2]) * invDet;result.data[0][2] = (data[0][1] * data[1][2] - data[0][2] * data[1][1]) * invDet;result.data[1][0] = (data[1][2] * data[2][0] - data[1][0] * data[2][2]) * invDet;result.data[1][1] = (data[0][0] * data[2][2] - data[0][2] * data[2][0]) * invDet;result.data[1][2] = (data[0][2] * data[1][0] - data[0][0] * data[1][2]) * invDet;result.data[2][0] = (data[1][0] * data[2][1] - data[1][1] * data[2][0]) * invDet;result.data[2][1] = (data[0][1] * data[2][0] - data[0][0] * data[2][1]) * invDet;result.data[2][2] = (data[0][0] * data[1][1] - data[0][1] * data[1][0]) * invDet;return result;
}// 轉置矩陣實現
Matrix3x3 Matrix3x3::transpose() const {Matrix3x3 result;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {result.data[i][j] = data[j][i];}}return result;
}// 特征值計算實現
std::array<double, 3> Matrix3x3::eigenvalues() const {// 計算特征多項式系數double a = 1.0;double b = -(data[0][0] + data[1][1] + data[2][2]);double c = data[0][0] * data[1][1] + data[1][1] * data[2][2] + data[2][2] * data[0][0] -data[0][1] * data[1][0] - data[1][2] * data[2][1] - data[2][0] * data[0][2];double d = -determinant();// 求解三次方程// 這里使用簡化的方法,實際應用中可能需要更復雜的數值方法std::array<double, 3> roots;// ... 求解三次方程的代碼 ...return roots;
}// 特征向量計算實現
std::array<Matrix3x3, 3> Matrix3x3::eigenvectors() const {std::array<double, 3> eigenvals = eigenvalues();std::array<Matrix3x3, 3> eigenvecs;// ... 計算特征向量的代碼 ...return eigenvecs;
}// 可逆性檢查實現
bool Matrix3x3::isInvertible() const {return determinant() != 0.0;
}// 對稱性檢查實現
bool Matrix3x3::isSymmetric() const {for (int i = 0; i < 3; ++i) {for (int j = i + 1; j < 3; ++j) {if (data[i][j] != data[j][i]) {return false;}}}return true;
}// 正交性檢查實現
bool Matrix3x3::isOrthogonal() const {Matrix3x3 product = *this * transpose();Matrix3x3 identity = Matrix3x3::identity();for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {if (std::abs(product.data[i][j] - identity.data[i][j]) > 1e-10) {return false;}}}return true;
}// 單位矩陣創建實現
Matrix3x3 Matrix3x3::identity() {return Matrix3x3();
}// 旋轉矩陣創建實現
Matrix3x3 Matrix3x3::rotation(double theta, char axis) {Matrix3x3 result;double cos_theta = std::cos(theta);double sin_theta = std::sin(theta);switch (axis) {case 'x':result.data[1][1] = cos_theta;result.data[1][2] = -sin_theta;result.data[2][1] = sin_theta;result.data[2][2] = cos_theta;break;case 'y':result.data[0][0] = cos_theta;result.data[0][2] = sin_theta;result.data[2][0] = -sin_theta;result.data[2][2] = cos_theta;break;case 'z':result.data[0][0] = cos_theta;result.data[0][1] = -sin_theta;result.data[1][0] = sin_theta;result.data[1][1] = cos_theta;break;default:throw std::runtime_error("Invalid rotation axis");}return result;
}// 縮放矩陣創建實現
Matrix3x3 Matrix3x3::scaling(double sx, double sy, double sz) {Matrix3x3 result;result.data[0][0] = sx;result.data[1][1] = sy;result.data[2][2] = sz;return result;
}// 輸出運算符實現
std::ostream& operator<<(std::ostream& os, const Matrix3x3& m) {for (int i = 0; i < 3; ++i) {os << "[ ";for (int j = 0; j < 3; ++j) {os << m.data[i][j] << " ";}os << "]" << std::endl;}return os;
}} // namespace linear_algebra
} // namespace math

3. 使用示例

3.1 基本運算

#include "matrix3x3.h"
#include <iostream>using namespace math::linear_algebra;int main() {// 創建矩陣Matrix3x3 m1({{{1.0, 2.0, 3.0},{4.0, 5.0, 6.0},{7.0, 8.0, 9.0}}});Matrix3x3 m2({{{9.0, 8.0, 7.0},{6.0, 5.0, 4.0},{3.0, 2.0, 1.0}}});// 基本運算Matrix3x3 sum = m1 + m2;      // 矩陣加法Matrix3x3 diff = m1 - m2;     // 矩陣減法Matrix3x3 prod = m1 * m2;     // 矩陣乘法Matrix3x3 scaled = m1 * 2.0;  // 標量乘法// 輸出結果std::cout << "m1:\n" << m1 << std::endl;std::cout << "m2:\n" << m2 << std::endl;std::cout << "m1 + m2:\n" << sum << std::endl;std::cout << "m1 - m2:\n" << diff << std::endl;std::cout << "m1 * m2:\n" << prod << std::endl;std::cout << "m1 * 2:\n" << scaled << std::endl;return 0;
}

3.2 矩陣變換

#include "matrix3x3.h"
#include <iostream>
#include <cmath>using namespace math::linear_algebra;int main() {// 創建旋轉矩陣(繞Z軸旋轉45度)Matrix3x3 rotation = Matrix3x3::rotation(M_PI / 4.0, 'z');// 創建縮放矩陣Matrix3x3 scaling = Matrix3x3::scaling(2.0, 3.0, 4.0);// 組合變換Matrix3x3 transform = rotation * scaling;// 輸出結果std::cout << "旋轉矩陣:\n" << rotation << std::endl;std::cout << "縮放矩陣:\n" << scaling << std::endl;std::cout << "組合變換:\n" << transform << std::endl;return 0;
}

4. 編譯和運行

4.1 編譯

使用提供的Makefile進行編譯:

make        # 編譯所有目標
make test   # 運行測試
make demo   # 運行示例
make clean  # 清理編譯文件

4.2 運行測試

./matrix3x3_test

4.3 運行示例

./matrix3x3_demo

5. 注意事項

  1. 數值精度

    • 在比較浮點數時使用適當的誤差范圍
    • 例如:std::abs(det) < 1e-10 判斷是否可逆
  2. 異常處理

    • 除以零的情況
    • 不可逆矩陣求逆的情況
    • 無效的旋轉軸
  3. 性能考慮

    • 矩陣乘法的時間復雜度為O(n3)
    • 特征值計算可能需要迭代方法
    • 考慮使用SIMD指令優化計算
  4. 使用建議

    • 優先使用成員函數而不是全局函數
    • 保持接口的一致性
    • 提供清晰的錯誤信息

6. 擴展閱讀

  1. 線性代數基礎

    • 矩陣運算
    • 行列式
    • 特征值和特征向量
  2. 三維變換

    • 旋轉矩陣
    • 縮放矩陣
    • 組合變換
  3. 應用領域

    • 計算機圖形學
    • 機器人學
    • 物理模擬
    • 游戲開發

    聲明

該文章為學習過程中的筆記,目的是防止自己忘記,也為了方便隨時隨地查閱。其中大部分內容收集于互聯網。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92182.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習前置知識

文章目錄介紹數據操作張量張量的定義1. **張量的維度&#xff08;Rank&#xff09;**2. **張量的形狀&#xff08;Shape&#xff09;**簡單的數據預處理&#xff08;插值線性代數微積分概率論1. 基本概念(1) 隨機試驗與事件(2) 概率公理&#xff08;Kolmogorov公理&#xff09;…

XSS學習總結

一.XSS概述 跨站腳本攻擊&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一種常見的網絡安全漏洞&#xff0c;攻擊者通過在網頁上注入惡意腳本代碼&#xff0c;從而在用戶的瀏覽器上執行惡意操作。這些腳本可以是 JavaScript、HTML 或其他網頁腳本語言。一旦用…

計算機網絡中:傳輸層和網絡層之間是如何配合的

可以把網絡層和傳輸層想成一個“快遞系統”&#xff1a; 網絡層&#xff08;IP 層&#xff09; 郵政系統&#xff1a;只負責把“包裹”&#xff08;IP 數據報&#xff09;從 A 地搬到 B 地&#xff0c;不保證順序、不保證不丟、不保證不重復。傳輸層&#xff08;TCP/UDP 層&am…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 用戶登錄實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解用戶登錄實現 視頻在線地址&#xff1a; …

Redis主從復制數據同步實現原理詳細介紹

文章目錄一、主從復制的概念二、全量復制&#xff08;完整重同步&#xff09;三、增量復制&#xff08;部分重同步&#xff09;1. 增量復制的核心思想2. 增量復制的實現3. 復制偏移量&#xff08;replicationoffset&#xff09;4. 復制積壓緩沖區&#xff08;replicationbacklo…

docker 軟件bug 誤導他人 筆記

DockerDesktopInstaller.exe install --installation-dirX:\AI-AI\docker\pro\ 由于 Docker官方隨便修改安裝命令&#xff0c;這個在4.4一下是無法使用的&#xff0c;存在誤導他人

Python 進階(六): Word 基本操作

目錄 1. 概述2. 寫入 2.1 標題2.2 段落2.3 表格2.4 圖片2.5 樣式 3. 讀取 1. 概述 Word 是一個十分常用的文字處理工具&#xff0c;通常我們都是手動來操作它&#xff0c;本節我們來看一下如何通過 Python 來操作。 Python 提供了 python-docx 庫&#xff0c;該庫就是為 Wo…

OpenLayers 入門指南【三】:API概要

目錄一、官方文檔二、核心類三、總結一、官方文檔 首頁右側有四個欄目分別是 Docs(文檔):也可以理解為使用指南&#xff0c;涵蓋一下四個模塊 Quick Start(快速入門)&#xff1a;介紹如何快速引入并使用OpenLayers快速構建一個地圖應用FAQ(問答)&#xff1a;介紹一些常見問題的…

JAVA面試寶典 -《Kafka 高吞吐量架構實戰:原理解析與性能優化全攻略》

&#x1f680; Kafka 高吞吐量架構實戰&#xff1a;原理解析與性能優化全攻略 隨著大數據技術在日志收集、埋點監控、訂單流處理等場景的普及&#xff0c;Kafka 已成為流處理架構中的核心組件。它之所以能在海量數據場景下保持高吞吐、低延遲&#xff0c;源于其在架構層面和底…

把sudo搞壞了怎么修復:報錯sudo: /etc/sudo.conf is owned by uid 1000, should be 0

今天部署 NFS 的時候一不小心給/etc目錄下所有的文件都所有者給改了&#xff0c;然后使用sudo的時候就出現了下面的問題&#xff1a; sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudoers i…

VUE前端項目開發1.0.1版本

項目包含用戶權限管理、表單提交、數據上傳下載、儀表盤可視化等功能&#xff0c;非常適合新手從零開始學習Vue3前端開發&#xff0c;下述包含所有開發源代碼&#xff0c;敬請食用 廢話少說先上圖: 登陸界面: 儀表盤管理系統: 用戶管理: 對于普通用戶只有儀表盤和個人信息界…

低代碼平臺能否完全取代傳統前端開發

低代碼平臺不能完全取代傳統前端開發&#xff0c;主要原因包括靈活性有限、性能優化能力不足、復雜定制需求難以實現。 低代碼平臺盡管能快速開發出相對標準化的應用&#xff0c;但在處理復雜、個性化的業務需求時&#xff0c;明顯表現出不足。尤其在需要精細化控制UI界面、高性…

Git 中如何比較不同版本之間的差異?常用命令有哪些?

回答重點1&#xff09; git diff <commit1> <commit2> &#xff1a;比較兩個指定的提交之間的差異。2&#xff09; git diff <branch1> <branch2> &#xff1a;比較兩個分支之間的差異。3&#xff09; git diff <path> &#xff1a;比較工作目錄…

MySQL 8.0 OCP 1Z0-908 題目解析(32)

題目125 Choose three. Identify three functions of MySQL Enterprise Monitor. □ A) Analyze query performance. □ B) Start a logical backup. □ C) Determine the availability of monitored MySQL servers. □ D) Centrally manage users. □ E) Start a MySQL Enterp…

Spring處理器和Bean的生命周期

Spring處理器和Bean的生命周期Spring處理器是對Bean對象的的開發可以對BeanDifinition進行操作&#xff0c;例如動態添加、修改BeanDefinition、動態修改Bean。&#xff0c;也可以在Bean對象創建后對Bean對象進行代理增強。注意&#xff1a;對于處理器要又一個正確的認知&#…

Spring Framework源碼解析——BeanFactory

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl1. BeanFactory 概述 BeanFactory 是 Spring IoC 容器的最基礎接口&#xff0c;它定義了獲取、配置和管理 Bean 的核心方法。它是 Spring 框架中容器體系的頂層接口之一&#…

C# 計算梯形面積和周長的程序(Program to calculate area and perimeter of Trapezium)

梯形是至少有一對邊平行&#xff0c;其他兩條邊可以不平行的四邊形。平行邊稱為梯形的底&#xff0c;其他兩條邊稱為梯形的腿。平行邊之間的垂直距離稱為梯形的高。公式 &#xff1a; 梯形面積&#xff1a; 0.5 * (a b) * h梯形周長&#xff1a; a b c d例子&#xff1a; 輸…

【計算機考研(408)- 數據結構】數組和特殊矩陣

數組和特殊矩陣 數組 數組的定義 數組是由n(n>1)個相同類型的數據元素構成的有限序列。每個數據元素稱為一個數組元素&#xff0c;每個元素在n個線性關系中的序號稱之為該元素的下標&#xff0c;下標的取值范圍稱為數組的維界。 數組是[[線性表]]的推廣&#xff0c;一維數組…

Agent架構與工作原理:理解智能體的核心機制

Agent架構與工作原理&#xff1a;深入理解智能體的核心機制 AI Agent的核心組成部分 一個完整的AI Agent通常由以下幾個核心模塊組成&#xff1a; 1. 規劃模塊&#xff08;Planning Module&#xff09; 規劃模塊是Agent的"大腦"&#xff0c;負責制定行動策略。它接收…

解決vscode中vue格式化后縮進太小的問題,并去除分號 - 設置Vetur tabSize從2到4,設置prettier取消分號semi

效果圖 左邊原來的&#xff0c;右邊是設置后的效果 實現步驟 安裝插件 Vetur 安裝插件 prettier Vscode > 文件 > 首選項 > 設置 搜索vetur > 找到比較下面的“Vetur > Format > Options: Tab Size” > 設置縮進為4 在附近找到“Vetur > Format: De…