Eigen稀疏矩陣類 (SparseMatrix)

1.?SparseMatrix?核心屬性與初始化

模板參數

cpp

SparseMatrix<Scalar, Options, StorageIndex>
  • Scalar:數據類型(如?double,?float)。

  • Options:存儲格式(默認?ColMajor,可選?RowMajor)。

  • StorageIndex:索引類型(通常為?int)。

關鍵屬性
屬性說明示例
rows()矩陣行數int rows = mat.rows();
cols()矩陣列數int cols = mat.cols();
nonZeros()非零元素數量int nnz = mat.nonZeros();
isCompressed()是否為壓縮格式(CRS/CCS)bool compressed = mat.isCompressed();
初始化方式
方法示例說明
直接構造SparseMatrix<double> mat(100, 100);空矩陣(100x100)
三重態列表(Triplet)見下文逐元素填充
從稠密矩陣轉換SparseMatrix<double> sp = dense.sparseView();自動過濾零值

2. 核心方法

(1) 元素插入與訪問
方法參數說明功能示例
insert(i, j, value)i: 行索引,j: 列索引,value: 值插入非零元素(若存在則覆蓋)mat.insert(0, 1) = 3.14;
coeffRef(i, j)同上訪問/修改元素(若不存在則插入)mat.coeffRef(1, 2) += 1.0;
makeCompressed()壓縮存儲(CRS/CCS格式)mat.makeCompressed();(此后無法插入新元素)
valuePtr(),?innerIndexPtr(),?outerIndexPtr()獲取壓縮格式的底層數組指針用于直接操作底層數據(高級用法)
(2) 矩陣操作
方法參數說明功能示例
reserve(Size)Size: 預估非零元素數預分配內存mat.reserve(1000);
prune(Scalar, RealScalar)閾值和參考值刪除絕對值小于閾值的元素mat.prune(1e-5, 0.0);
transpose()返回轉置矩陣(視圖)SparseMatrix<double> matT = mat.transpose();
sum()所有元素求和double total = mat.sum();
(3) 塊操作與迭代
方法參數說明功能示例
block(startRow, startCol, rows, cols)起始位置和塊大小返回子矩陣(視圖)auto submat = mat.block(10, 10, 5, 5);
innerVector(outer)outer: 列號(ColMajor)返回列/行向量(視圖)SparseVector<double> col = mat.innerVector(0);
迭代器(InnerIterator遍歷非零元素見下方代碼示例

3. 輔助類:Triplet

用于高效構建稀疏矩陣(先收集非零元素,再一次性填充):

cpp

#include <Eigen/SparseCore>
using namespace Eigen;std::vector<Triplet<double>> triplets;
triplets.push_back(Triplet<double>(0, 1, 3.0));  // (i, j, value)
triplets.push_back(Triplet<double>(1, 2, 4.0));SparseMatrix<double> mat(3, 3);
mat.setFromTriplets(triplets.begin(), triplets.end());

4. 稀疏矩陣分解與求解

求解器類
類名適用場景關鍵方法
SimplicialLLT對稱正定矩陣compute(mat)?+?solve(b)
SparseLU通用方陣analyzePattern()?+?factorize()
ConjugateGradient對稱正定矩陣(迭代法)setTolerance()?+?compute()
求解示例

cpp

SparseMatrix<double> A;
VectorXd b, x;// 使用 SimplicialLLT 分解
SimplicialLLT<SparseMatrix<double>> solver;
solver.compute(A);
if (solver.info() == Success) {x = solver.solve(b);
}// 使用迭代法(如共軛梯度)
ConjugateGradient<SparseMatrix<double>> cg;
cg.setTolerance(1e-6);
cg.compute(A);
x = cg.solve(b);

5. 代碼示例

遍歷非零元素

cpp

for (int k = 0; k < mat.outerSize(); ++k) {for (SparseMatrix<double>::InnerIterator it(mat, k); it; ++it) {std::cout << "(" << it.row() << "," << it.col() << ") = " << it.value() << std::endl;}
}
矩陣運算

cpp

SparseMatrix<double> A, B;
A.resize(100, 100);
B.resize(100, 100);
// ... 填充 A 和 B ...// 稀疏矩陣加法
SparseMatrix<double> C = A + B;// 稀疏矩陣乘法
SparseMatrix<double> D = A * B;// 標量乘法
SparseMatrix<double> E = 2.5 * A;

6. 性能優化技巧

  1. 預分配內存:通過?reserve()?或?Triplet?避免多次擴容。

  2. 壓縮存儲:操作完成后調用?makeCompressed()?提升計算效率。

  3. 選擇合適的求解器

    • 對稱正定矩陣:優先用?SimplicialLLT?或?ConjugateGradient

    • 非對稱矩陣:使用?SparseLU?或?BiCGSTAB

7. 常見問題

  • 插入效率:未壓縮模式下插入更快,但計算前需壓縮。

  • 內存占用:稀疏矩陣內存 ≈?(2 * nnz + cols + 1) * sizeof(Index) + nnz * sizeof(Scalar)

掌握這些方法后,可高效處理大規模稀疏線性代數問題!更多細節見?Eigen SparseMatrix 文檔。

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

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

相關文章

如何監控和分析MySQL數據庫的性能?

文章目錄 前言1.環境配置2. 使用 MySQL 自帶工具SHOW STATUS 命令SHOW PROCESSLIST 命令EXPLAIN 命令 3. 開啟慢查詢日志操作步驟 4. 使用第三方監控工具MySQL Enterprise MonitorPercona ToolkitNagiosZabbix 5. 分析系統資源使用情況工具及方法 前言 要監控和分析 MySQL 數據…

高中數學聯賽模擬試題精選第17套幾何題

在四邊形 A B C D ABCD ABCD 中, A B A D AB AD ABAD, B C ⊥ A B BC \perp AB BC⊥AB, ∠ D C B \angle DCB ∠DCB 的平分線與 A B AB AB 交于 E E E, 過點 A A A 且垂直于 C D CD CD 的直線與 D E DE DE 交于 F F F, M M M 是 B D BD BD 的中點. 求證: F M ∥…

ZYNQ筆記(十三):雙核 AMP 通信實驗

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; ZYNQ 裸機雙核 AMP 實驗&#xff1a; CPU0 接收串口的數據&#xff0c;并寫入 OCM 中&#xff0c;然后利用軟件產生中斷觸發 CPU1&#xff1b;CPU1 接收到中斷后&#xff0c;根據從 OCM 中讀出的數據控制呼吸燈的頻…

桌面端開發技術棧選型:開啟高效開發之旅

在數字化浪潮中&#xff0c;桌面端應用依然占據重要地位&#xff0c;而選擇合適的技術棧是打造優質桌面端應用的關鍵一步。以下是多種主流桌面端開發技術棧的介紹與對比&#xff0c;希望能為大家提供有價值的參考。 基于 Web 技術的跨平臺框架 ? Electron&#xff1a; ? 特…

C++ 的 輸入輸出流(I/O Streams)

什么是輸入輸出流 C 的輸入輸出操作是通過 流&#xff08;stream&#xff09; 機制實現的。 流——就是數據的流動通道&#xff0c;比如&#xff1a; 輸入流&#xff1a;從設備&#xff08;如鍵盤、文件&#xff09;讀取數據 → 程序 輸出流&#xff1a;程序將數據寫入設備&…

軟件測評中心如何保障軟件質量與安全性?

軟件測評中心是一個專注于保障軟件質量、穩定性和安全性的專業機構。在整個軟件的生命周期中&#xff0c;它扮演著極其關鍵的角色。它運用科學的方法和嚴格的準則&#xff0c;對軟件進行全面而細致的檢測和評估&#xff0c;確保用戶獲得可靠的保障。 測評核心工作 軟件測評中…

論人際關系發展的階段

朋友關系的建立和發展是一個漸進的過程&#xff0c;通常需要經歷情感積累、信任磨合和價值觀融合等階段。以下是朋友關系發展的詳細階段劃分及核心特征&#xff1a; 一、表層接觸階段&#xff08;社交試探期&#xff09; 核心特征&#xff1a;以信息交換為主&#xff0c;關系停…

網絡IP沖突的成因與解決方案

網絡IP沖突的成因與解決方案 一、IP沖突的常見現象與危害二、IP沖突的常見原因三、6種實用解決方案四、預防IP沖突的4個最佳實踐五、總結 前言 肝文不易&#xff0c;點個免費的贊和關注&#xff0c;有錯誤的地方請指出&#xff0c;看個人主頁有驚喜。 作者&#xff1a;神的孩子…

前端節流、防抖函數

節流 什么是節流&#xff1f; 節流就是同一個事件 一秒鐘他執行了很多次。但是我不想他執行這么多次&#xff0c;我只想讓他執行一次 或者兩次。 那該怎么辦&#xff1f; why baby why 那我想就是他執行的時候 我就設置一個定時器&#xff0c;如果定時器是空的&#xff0c;等會…

LeetCode第171題_Excel表列序號

LeetCode 第171題&#xff1a;Excel表列序號 題目描述 給你一個字符串 columnTitle&#xff0c;表示 Excel 表格中的列名稱。返回 該列名稱對應的列序號。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...難度 簡單 題目鏈…

基于YOLO與PySide6的道路缺陷檢測系統(源碼)

道路基礎設施的健康狀況直接影響交通安全與城市運營效率。傳統人工巡檢方式存在效率低、覆蓋范圍有限等問題,而基于深度學習的自動化檢測技術為道路缺陷識別提供了創新解決方案。本文介紹一個結合YOLO目標檢測模型與PySide6圖形界面的道路塌陷檢測系統,實現了高效、可視化的缺…

04_jQuery

文章目錄 一、jQuery介紹1.1、jQuery概述1.2、jQuery特點1.3 為什么要用jQuery 二、引入jQuery2.1、直接引入2.2、CDN引入 三、jQuery語法3.1、基本使用3.2、jQuery事件及常用事件方法3.3、jQuery選擇器&#xff08;重點&#xff09;3.3.1、基本選擇器3.3.2、層次選擇器3.3.3、…

Adruino:傳感器及步進電機

一、傳感器* 1、溫濕度傳感器 DHT11它采用專用的數字采集技術和溫濕度傳感器技術&#xff0c;包括一個電阻式感濕元件和NTC測溫元件&#xff0c;并與一個高性能的8位單片機連接。DATA端采用串行接口&#xff08;單線雙向&#xff09;與微控制器進行同步和通信。 DHT11的供電電…

高中數學聯賽模擬試題精選第18套幾何題

在 △ A B C \triangle ABC △ABC 中, A B < A C AB< AC AB<AC, 點 K K K, L L L, M M M 分別是邊 B C BC BC, C A C A CA, A B AB AB 的中點. △ A B C \triangle ABC △ABC 的內切圓圓心為 I I I, 且與邊 B C BC BC 相切于點 D D D. 直線 l l l 經過線段…

ubantu18.04(Hadoop3.1.3)之Spark安裝和編程實踐

說明&#xff1a;本文圖片較多&#xff0c;耐心等待加載。&#xff08;建議用電腦&#xff09; 注意所有打開的文件都要記得保存。 第一步&#xff1a;準備工作 本文是在之前Hadoop搭建完集群環境后繼續進行的&#xff0c;因此需要讀者完成我之前教程的所有操作。 以下所有操…

DCDC芯片,boost升壓電路設計,MT3608 芯片深度解析:從架構到設計的全維度技術手冊

一、硬件架構解析:電流模式升壓 converter 的核心設計 (一)電路拓撲與核心組件 MT3608 采用恒定頻率峰值電流模式升壓(Boost)轉換器架構,核心由以下模塊構成: 集成功率 MOSFET 內置 80mΩ 導通電阻的 N 溝道 MOSFET,漏極(Drain)對應引腳 SW,源極(Source)內部接…

Java 日志:掌握本地與網絡日志技術

日志記錄是軟件開發中不可或缺的一部分&#xff0c;它為開發者提供了洞察應用程序行為、診斷問題和監控性能的手段。在 Java 生態系統中&#xff0c;日志框架如 Java Util Logging (JUL)、Log4j 和 Simple Logging Facade for Java (SLF4J) 提供了豐富的功能。然而&#xff0c;…

上位機知識篇---時鐘分頻

文章目錄 前言 前言 本文簡單介紹了一下時鐘分頻。時鐘分頻&#xff08;Clock Division&#xff09;是數字電路設計中常見的技術&#xff0c;用于將高頻時鐘信號轉換為較低頻率的時鐘信號&#xff0c;以滿足不同模塊的時序需求。它在處理器、FPGA、SoC&#xff08;片上系統&am…

推薦幾個免費提取音視頻文案的工具(SRT格式、通義千問、飛書妙記、VideoCaptioner、AsrTools)

文章目錄 1. 前言2. SRT格式2.1 SRT 格式的特點2.2 SRT 文件的組成2.3 SRT 文件示例 3. 通義千問3.1 官網3.2 上傳音視頻文件3.3 導出文案 4. 飛書妙記4.1 官網4.2 上傳音視頻文件4.3 導出文案4.4 缺點 5. VideoCaptioner5.1 GitHub地址5.2 下載5.2.1 通過GitHub下載5.2.2 通過…

Linux深度探索:進程管理與系統架構

1.馮諾依曼體系結構 我們常見的計算機&#xff0c;如筆記本。我們不常見的計算機&#xff0c;如服務器&#xff0c;大部分都遵守馮諾依曼體系。 截至目前&#xff0c;我們所認識的計算機&#xff0c;都是由?個個的硬件組件組成。 輸入設備&#xff1a;鍵盤&#xff0c;鼠標…