当前位置: 首页 > article >正文

Armadillo C++ 线性代数库介绍与使用

文章目录

  • Armadillo C++ 线性代数库介绍与使用
    • 主要特点
    • 安装
      • Linux (Ubuntu/Debian)
      • macOS (使用 Homebrew)
      • Windows (使用 vcpkg)
    • 基本使用
      • 包含头文件
      • 矩阵创建与初始化
      • 基本运算
      • 矩阵分解
      • 统计运算
      • 保存和加载数据
    • 性能优化建议
    • 示例程序
    • 与 MATLAB 语法对比
  • 使用Armadillo函数库的稀疏矩阵计算功能
    • 1. 包含必要的头文件
    • 2. 创建稀疏矩阵
      • 从三元组(值,行,列)创建
      • 批量创建
      • 从稠密矩阵转换
    • 3. 稀疏矩阵基本操作
      • 访问元素
      • 矩阵运算
      • 特殊函数
    • 4. 稀疏矩阵与稠密矩阵混合运算
    • 5. 稀疏线性系统求解
    • 6. 节省内存的高级用法
    • 7. 保存和加载稀疏矩阵
    • 注意事项
  • Armadillo 线性代数库的编译与构建指南
    • 前提条件
    • 编译安装
      • 1. 使用 CMake 构建
      • 2. 配置选项
    • 测试安装
    • 链接选项
    • 常见问题解决
    • 使用 OpenBLAS 替代

Armadillo C++ 线性代数库介绍与使用

Armadillo 是一个高质量的 C++ 线性代数库,提供了类似于 MATLAB 的高级语法和功能。它专注于快速开发,同时保持高性能。

主要特点

  1. 直观的语法:类似 MATLAB 的 API 设计
  2. 高性能:使用模板元编程和延迟计算优化性能
  3. 广泛的线性代数功能:矩阵运算、分解、统计等
  4. 与其他库集成:可与 LAPACK、BLAS、OpenBLAS 等集成
  5. 跨平台:支持 Windows、Linux、macOS

安装

Linux (Ubuntu/Debian)

sudo apt-get install libarmadillo-dev

macOS (使用 Homebrew)

brew install armadillo

Windows (使用 vcpkg)

vcpkg install armadillo

基本使用

包含头文件

#include <armadillo>
using namespace arma;

矩阵创建与初始化

// 创建 3x3 矩阵
mat A = randu<mat>(3,3);// 创建特定值矩阵
mat B = {{1.0, 2.0, 3.0},{4.0, 5.0, 6.0},{7.0, 8.0, 9.0}
};// 创建单位矩阵
mat C = eye<mat>(3,3);// 创建向量
vec v = {1.0, 2.0, 3.0};

基本运算

// 矩阵加法
mat D = A + B;// 矩阵乘法
mat E = A * B;// 标量运算
mat F = 2.5 * A;// 转置
mat G = A.t();// 逆矩阵
mat H = inv(A);// 行列式
double det_val = det(A);

矩阵分解

// LU 分解
mat P, L, U;
lu(L, U, P, A);// QR 分解
mat Q, R;
qr(Q, R, A);// 特征分解
vec eigval;
mat eigvec;
eig_sym(eigval, eigvec, A);// SVD 分解
mat U, V;
vec s;
svd(U, s, V, A);

统计运算

// 均值
double mean_val = mean(A);// 标准差
double stddev_val = stddev(A);// 相关系数矩阵
mat corr_mat = cor(A);// 协方差矩阵
mat cov_mat = cov(A);

保存和加载数据

// 保存矩阵到文件
A.save("matrix.txt", raw_ascii);// 从文件加载矩阵
mat loaded_A;
loaded_A.load("matrix.txt");

性能优化建议

  1. 使用优化的 BLAS/LAPACK 实现:链接 OpenBLAS 或 Intel MKL
  2. 启用编译器优化:使用 -O3/O2 编译选项
  3. 避免不必要的复制:使用 .submat().cols()/.rows() 进行子矩阵操作
  4. 预分配内存:对于大型矩阵,预先分配内存

示例程序

#include <iostream>
#include <armadillo>using namespace std;
using namespace arma;int main() {// 创建随机矩阵mat A = randu<mat>(5,5);// 创建向量vec b = randu<vec>(5);cout << "Matrix A:\n" << A << endl;cout << "Vector b:\n" << b << endl;// 解线性方程组 Ax = bvec x = solve(A, b);cout << "Solution x:\n" << x << endl;// 验证解cout << "A*x should equal b:\n" << A*x << endl;// 计算特征值和特征向量cx_vec eigval;cx_mat eigvec;eig_gen(eigval, eigvec, A);cout << "Eigenvalues:\n" << eigval << endl;cout << "Eigenvectors:\n" << eigvec << endl;return 0;
}

与 MATLAB 语法对比

MATLAB 语法Armadillo 语法
A = [1 2; 3 4]mat A = {{1,2}, {3,4}}
A * BA * B
A .* BA % B
A’A.t()
inv(A)inv(A)
A \ bsolve(A, b)
eye(3)eye(3,3)

Armadillo 是一个强大的 C++ 线性代数库,特别适合需要高性能计算但又希望保持代码简洁的开发场景。


使用Armadillo函数库的稀疏矩阵计算功能

Armadillo是一个高性能的C++线性代数库,它提供了方便的稀疏矩阵支持。以下是使用Armadillo稀疏矩阵功能的基本方法:

1. 包含必要的头文件

#include <armadillo>
using namespace arma;

2. 创建稀疏矩阵

从三元组(值,行,列)创建

// 创建稀疏矩阵 (值, 行索引, 列索引)
sp_mat A(5, 5);  // 5x5的空稀疏矩阵// 插入元素
A(1, 2) = 3.0;   // 第2行第3列插入3.0
A(2, 3) = 4.0;   // 第3行第4列插入4.0
A(4, 4) = 5.0;   // 第5行第5列插入5.0

批量创建

// 值向量
vec values = {1.0, 2.0, 3.0};// 行索引向量 (从0开始)
uvec row_indices = {0, 2, 3};// 列索引向量 (从0开始)
uvec col_indices = {1, 2, 3};// 创建稀疏矩阵
sp_mat B(4, 4, values, row_indices, col_indices);

从稠密矩阵转换

mat dense_mat = randu<mat>(5,5);
sp_mat sparse_mat = sp_mat(dense_mat);  // 将非零元素转换为稀疏矩阵

3. 稀疏矩阵基本操作

访问元素

double val = A(1, 2);  // 获取第2行第3列的值

矩阵运算

sp_mat C = A + B;      // 稀疏矩阵相加
sp_mat D = A * B;      // 稀疏矩阵相乘
sp_mat E = trans(A);   // 转置

特殊函数

sp_mat F = speye(5,5);  // 创建5x5稀疏单位矩阵
sp_mat G = sprandu(5,5, 0.1);  // 随机稀疏矩阵,密度10%

4. 稀疏矩阵与稠密矩阵混合运算

mat X = randu<mat>(5,5);
mat Y = A * X;  // 稀疏矩阵乘以稠密矩阵

5. 稀疏线性系统求解

vec b = randu<vec>(5);
vec x = spsolve(A, b);  // 解稀疏线性系统Ax=b

6. 节省内存的高级用法

对于非常大的稀疏矩阵,可以使用以下方法更高效地构建:

sp_mat H(10000, 10000);  // 大型稀疏矩阵// 预分配内存(可选,可提高性能)
H.reserve(500);  // 预留500个非零元素的空间// 批量插入元素
for(int i=0; i<500; ++i) {H(i, 2*i) = i + 1.0;
}

7. 保存和加载稀疏矩阵

// 保存到磁盘
A.save("sparse_matrix.bin", arma_binary);// 从磁盘加载
sp_mat loaded_A;
loaded_A.load("sparse_matrix.bin");

注意事项

  1. Armadillo的稀疏矩阵使用压缩稀疏列(CSC)格式存储
  2. 稀疏矩阵操作通常比稠密矩阵慢,但对于稀疏性高的矩阵能节省大量内存
  3. 对于非常大规模的稀疏矩阵,考虑使用专门的稀疏求解器如SuperLU

通过以上方法,您可以充分利用Armadillo库的稀疏矩阵功能来处理大规模稀疏线性代数问题。


Armadillo 线性代数库的编译与构建指南

Armadillo 是一个高质量的 C++ 线性代数库,提供了类似于 Matlab 的语法和功能。以下是 Armadillo 库的编译和构建步骤:

前提条件

  1. 安装依赖库

    • LAPACK (线性代数计算)
    • BLAS (基础线性代数子程序)
    • ARPACK (可选,用于特征值分解)
    • SuperLU (可选,用于稀疏矩阵)

    在 Ubuntu/Debian 上可以使用:

    sudo apt-get install liblapack-dev libblas-dev libarpack2-dev libsuperlu-dev
    
  2. 下载 Armadillo

    • 从 Armadillo 官方网站 下载最新版本
    • 或使用 wget:
    wget http://sourceforge.net/projects/arma/files/armadillo-12.4.1.tar.xz
    tar xvf armadillo-12.4.1.tar.xz
    cd armadillo-12.4.1
    

编译安装

1. 使用 CMake 构建

mkdir build
cd build
cmake ..
make
sudo make install

2. 配置选项

CMake 配置时可以添加以下选项:

cmake -DCMAKE_INSTALL_PREFIX=/usr/local \-DDETECT_HDF5=false \..

常用选项:

  • -DDETECT_HDF5:是否启用 HDF5 支持
  • -DARMA_USE_HDF5:强制启用/禁用 HDF5
  • -DARMA_64BIT_WORD:使用 64 位整数索引大型矩阵

测试安装

创建一个简单的测试程序 test.cpp

#include <iostream>
#include <armadillo>using namespace std;
using namespace arma;int main() {mat A = randu<mat>(4,4);mat B = randu<mat>(4,4);cout << "A:\n" << A << "\n";cout << "B:\n" << B << "\n";cout << "A*B:\n" << A*B << "\n";return 0;
}

编译并运行:

g++ test.cpp -o test -larmadillo
./test

链接选项

编译使用 Armadillo 的程序时,需要链接以下库:

g++ your_program.cpp -o your_program -larmadillo -llapack -lblas

常见问题解决

  1. 找不到头文件

    • 确保安装路径在编译器的包含路径中
    • 使用 -I 指定路径,如 -I/usr/local/include
  2. 链接错误

    • 确保所有依赖库已安装
    • 检查库文件路径是否正确
  3. 性能优化

    • 链接优化的 BLAS 实现(如 OpenBLAS 或 Intel MKL)
    • 编译时启用优化选项 -O2-O3

使用 OpenBLAS 替代

对于更好的性能,可以使用 OpenBLAS:

sudo apt-get install libopenblas-dev

然后重新编译 Armadillo,它会自动检测并使用 OpenBLAS。

希望这个指南能帮助你成功构建和使用 Armadillo 库!

相关文章:

Armadillo C++ 线性代数库介绍与使用

文章目录 Armadillo C 线性代数库介绍与使用主要特点安装Linux (Ubuntu/Debian)macOS (使用 Homebrew)Windows (使用 vcpkg) 基本使用包含头文件矩阵创建与初始化基本运算矩阵分解统计运算保存和加载数据 性能优化建议示例程序与 MATLAB 语法对比 使用Armadillo函数库的稀疏矩阵…...

吴恩达机器学习笔记:逻辑回归3

3.判定边界 现在说下决策边界(decision boundary)的概念。这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么。 在逻辑回归中&#xff0c;我们预测&#xff1a; 当ℎθ (x) > 0.5时&#xff0c;预测 y 1。 当ℎθ (x) < 0.5时&#xff0c;预测 y 0 。 根据…...

大模型知识

############################################################## 一、vllm大模型测试参数和原理 tempreature top_p top_k ############################################################## tempreature top_p top_k 作用&#xff1a;总体是控制模型的发散程度、多样…...

C/C++ 结构体:. 与 -> 的区别与用法及其STM32中的使用

目录 引言 一、深入理解 C/C 结构体&#xff1a;. 与 -> 的区别与用法 1. .&#xff08;点运算符&#xff09;详解2. ->&#xff08;箭头运算符&#xff09;详解3. . 与 -> 的等价与转换4. 常见错误与调试技巧5. C 特性与运算符重载6. 实战案例&#xff1a;链表与智能…...

docker中使用openresty

1.为什么要使用openresty 我这边是因为要使用1Panel&#xff0c;第一个最大的原因&#xff0c;就是图方便&#xff0c;比较可以一键安装。但以前一直都是直接安装nginx。所以需要一个过度。 2.如何查看openResty使用了nginx哪个版本 /usr/local/openresty/nginx/sbin/nginx …...

Jetpack Compose 中更新应用语言

在 Jetpack Compose 应用中更新语言需要结合传统的 Android 语言配置方法和 Compose 的重组机制。以下是完整的实现方案&#xff1a; 1. 创建语言管理类 object LocaleManager {private var currentLocale: Locale Locale.getDefault()fun setLocale(context: Context, local…...

Java 中的 super 关键字

个人总结&#xff1a; 1.子类构造方法中没有显式使用super&#xff0c;Java 也会默认调用父类的无参构造方法 2.当父类中没有无参构造方法&#xff0c;只有有参构造方法时&#xff0c;子类构造方法就必须显式地使用super来调用父类的有参构造方法。 3.如果父类没有定义任何构造…...

CMake基础:CMakeLists.txt 文件结构和语法

目录 1.CMakeLists.txt基本结构 2.核心语法规则 3.关键命令详解 4.常用预定义变量 5.变量和缓存 6.变量作用域与传递 7.注意事项 1.CMakeLists.txt基本结构 CMakeLists.txt 是 CMake 构建系统的核心配置文件&#xff0c;采用命令式语法组织项目结构和编译流程。主要用于…...

PCM音频数据的编解码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a…...

WebView2 Win7下部分机器触屏失效的问题

这个问题官方给了解决的方案&#xff0c;相关地址&#xff0c;只需要在项目中运行这个代码即可 public static void DisableWPFTabletSupport(){TabletDeviceCollection devices Tablet.TabletDevices;if (devices.Count > 0){Type inputManagerType typeof(InputManager)…...

Ubuntu 通过指令远程命令行配置WiFi连接

前提设备已经安装了无线网卡。 1、先通过命令行 ssh 登录机器。 2、搜索wifi设备&#xff0c;指令如下&#xff1a; sudo nmcli device wifi 3、输入需要联接的 wifi 名称和对应的wifi密码&#xff0c;指令如下&#xff1a; sudo nmcli device wifi connect wifi名称 passw…...

线程池优雅关闭的哲学

引言 关于并发的哲学&#xff0c;本文将着重强调那些关于线程池优雅关闭的一些技巧&#xff0c;希望对你有所启发。 强制关闭线程池的弊端 对于池化的线程池&#xff0c;如果采用强制关闭的方式将线程池直接关闭&#xff0c;就可能存在上下文消息消息&#xff0c;无法的很好…...

11.8 LangGraph生产级AI Agent开发:从节点定义到高并发架构的终极指南

使用 LangGraph 构建生产级 AI Agent:LangGraph 节点与边的实现 关键词:LangGraph 节点定义, 条件边实现, 状态管理, 多会话控制, 生产级 Agent 架构 1. LangGraph 核心设计解析 LangGraph 通过图结构抽象复杂 AI 工作流,其核心要素构成如下表所示: 组件作用描述代码对应…...

8天Python从入门到精通【itheima】-41~44

目录 41节-while循环的嵌套应用 1.学习目标 2.while循环的伪代码和生活情境中的应用 3.图片应用的代码案例 4.代码实例【Patrick自己亲手写的】&#xff1a; 5.whlie嵌套循环的注意点 6.小节总结 42节-while循环的嵌套案例-九九乘法表 1.补充知识-print的不换行 2.补充…...

深度图数据增强方案-随机增加ROI区域的深度

主要思想&#xff1a;随机增加ROI区域的深度&#xff0c;模拟物体处在不同位置的形态。 首先打印一张深度图中的深度信息分布&#xff1a; import cv2 import matplotlib.pyplot as plt import numpy as np import seaborn as sns def plot_grayscale_histogram(image_path)…...

[Java恶补day6] 15. 三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&a…...

Django模板及表单

什么是Django模板 Django模板是一种用于生成动态内容的文件&#xff0c;它使用Django模板语言&#xff08;Django Template Language&#xff0c;简称DTL&#xff09;来描述和渲染HTML页面。模板允许开发人员将动态数据与静态HTML结构分离&#xff0c;以实现更灵活和可维护的W…...

两个mysql的maven依赖要用哪个?

背景 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency>和 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId> &l…...

Kafka Consumer工作流程

Kafka Consumer工作流程图 1、启动与加入组 消费者启动后&#xff0c;会向 Kafka 集群中的某个 Broker 发送请求&#xff0c;请求加入特定消费者组。这个 Broker 中的消费者协调器&#xff08;Consumer Coordinator&#xff09;负责管理消费者组相关事宜。 2、组内分区分配&am…...

大腾智能 PDM 系统:全生命周期管理重塑制造企业数字化转型路径

在当今激烈的市场竞争中&#xff0c;产品迭代速度与质量已成为企业生存与发展的核心命脉。面对客户需求多元化、供应链协同复杂化、研发成本管控精细化等挑战&#xff0c;企业亟需一套能够贯穿产品全生命周期的数字化解决方案。 大腾智能PDM系统通过构建覆盖设计、研发、生产、…...

GATT 服务的核心函数bt_gatt_discover的介绍

目录 概述 1 GATT 基本概念 1.1 GATT 的介绍 1.2 GATT 的角色 1.3 核心组件 1.4 客户端操作 2 bt_gatt_discover函数的功能和应用 2.1 函数介绍 2.1 发现类型&#xff08;Discover Type&#xff09; 3 典型使用流程 3.1 服务发现示例 3.2 级联发现模式 3.3 按UUID过…...

【短距离通信】【WiFi】WiFi7关键技术之4096-QAM、MRU

目录 3. 4096-QAM 3.1 4096-QAM 3.2 QAM 的阶数越高越好吗&#xff1f; 4. MRU 4.1 OFDMA 和 RU 4.2 MRU 资源分配 3. 4096-QAM 摘要 本章主要介绍了Wi-Fi 7引入的4096-QAM对数据传输速率的提升。 3.1 4096-QAM 对速率的提升 Wi-Fi 标准一直致力于提升数据传输速率&a…...

C 语言学习笔记

文章目录 程序设计入门 --- C 语言第一周 程序设计与 C 语言1 计算机与编程语言:计算机怎么做事情的,编程语言是什么📒 1.1 计算机的普遍应用 —— 离了它,现代人可能不会“活”了**🌐 科学计算:计算机的“最强大脑”时刻****📊 数据处理:现代社会的“数字管家”***…...

【MySQL成神之路】MySQL函数总结

以下是MySQL函数的全面总结&#xff0c;包含概念说明和代码示例&#xff1a; 一、MySQL函数分类 1. 字符串函数 -- CONCAT&#xff1a;连接字符串 SELECT CONCAT(Hello, , World); -- 输出 Hello World -- SUBSTRING&#xff1a;截取子串 SELECT SUBSTRING(MySQL, 2, 3…...

线程池实战——数据库连接池

引言 作者在前面写了很多并发编程知识深度探索系列文章&#xff0c;反馈得知友友们收获颇丰&#xff0c;同时我也了解到友友们也有了对知识如何应用感到很模糊的问题。所以作者就打算写一个实战系列文章&#xff0c;让友友们切身感受一下怎么应用知识。话不多说&#xff0c;开…...

修改 vue-pdf 源码升级 pdfjs-dist 包, 以解决部分 pdf 文件显示花屏问题

文章目录 背景: 客户反馈有部分文件预览花屏 最终解决方案: 自己 fork vue-pdf 仓库, 修改 pdfjs-dist 版本, 升级到 3.3.122 (我是 vue2 项目 node 10 环境)修改源码中引用地址带有 pdfjs-dist/es5/ 的地方, 去掉 es5 , 另外如果还有报错自己搜一下 pdfjs-dist/ , 看看引用…...

基于moonshot模型的Dify大语言模型应用开发核心场景

基于moonshot模型的Dify大语言模型应用开发核心场景学习总结 一、Dify环境部署 1.Docker环境部署 这里使用vagrant部署&#xff0c;下载vagrant之后&#xff0c;vagrant up登陆&#xff0c;vagrant ssh&#xff0c;在vagrant 中使用 vagrant centos/7 init 快速创建虚拟机 安装…...

华为OD机试真题——字符串序列判定(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

在Java的list.forEach(即 Stream API 的 forEach 方法)中,无法直接使用 continue 或 break 语句的解决办法

说明 在 Java 的 list.forEach&#xff08;即 Stream API 的 forEach 方法&#xff09;中&#xff0c;无法直接使用 continue 或 break 语句&#xff0c;因为它是一个终结操作&#xff08;Terminal Operation&#xff09;&#xff0c;依赖于 Lambda 表达式或方法引用。 有些时…...

Java面向对象高级学习笔记

面向对象高级 -类变量 类变量-提出问题 提出问题的主要目的就是让大家思考解决之道&#xff0c;从而引出我要讲的知识点 说:有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?&#xff0c;编写程序解决。 类变量快速入门 思考: 如果,设计一个int co…...