C++ 之 newmat 矩阵运算库使用笔记

文章目录

  • Part.I Introduction
    • Chap.I newmat 简介
  • Part.II 安装与编译
    • Chap.I 直接使用源码
    • Chap.II 基于 CMake 使用源码
    • Chap.III 编译成库
  • Part.III 关于矩阵的构造与运算
    • Chap.I 矩阵的构造与初始化
    • Chap.II 矩阵的运算
    • Chap.III 矩阵维数和类型的更改
    • Chap.IV 矩阵最值统计
  • Reference

Part.I Introduction

Newmat 是一个优秀的矩阵运算库,它可以用来求解线性方程组、求解特征值和最小二乘等。虽然它不像 Eigen 那样大名鼎鼎,但是在一些比较古老的软件中经常会看到它的身影,本文为笔者使用它的过程中所做的一些笔记,可能会对初步接触到它的朋友有些许帮助。

在这里插入图片描述

Chap.I newmat 简介

Newmat 可以用来做什么?它可以用来求解线性方程组、求解特征值和最小二乘等,其支持的矩阵类型有

英文中文
Matrix矩形矩阵
UpperTriangularMatrix上三角矩阵
LowerTriangularMatrix下三角矩阵
DiagonalMatrix对角矩阵
SymmetricMatrix对称矩阵
BandMatrix带矩阵
UpperBandMatrix上三角带矩阵
LowerBandMatrix下三角带矩阵
SymmetricBandMatrix对称带矩阵
RowVector行矩阵
ColumnVector列矩阵
IdentityMatrix具有相同值的对角矩阵

该库包括操作*,+,-,*=,+=,-=,Kronecker 积,Schur 积,串联,逆,转置,类型之间的转换,子矩阵,行列式,Cholesky 分解,QR 三角化,奇异值分解,对称矩阵的特征值,排序,快速傅里叶和三角等。它适用于范围为10 × 10到您的机器将在单个数组中容纳的最大尺寸的矩阵。该包适用于非常小的矩阵,但变得相当低效。

Part.II 安装与编译

首先从官网下载源码

Chap.I 直接使用源码

下载解压好之后会看到文件夹中有个 nm11.htm,这个文件就是它的说明文档,双击打开,找到它的文件内容说明,我们需要的最核心的代码文件主要有下面的一些:

在这里插入图片描述
我们只需要上面的这 36(11*.h+25*.cpp)个文件即可。首先将这36个文件提出来放到一个文件夹(比如nm_src)中。

1、新建一个 VS C++ 空项目nm_test,将nm_src拷贝到项目所在文件夹
在这里插入图片描述
2、在 VS Studio 中选中 nm_test 项目,右键→添加→现有项→快捷键 Ctrl + A 全选→添加
在这里插入图片描述
3、选中源文件→右键添加→新建项→加一个新的 cpp 文件nm_test.cpp
在这里插入图片描述
4、将下面的代码贴到 nm_test.cpp 文件中,

/// \ingroup newmat
///@{/// \file nm_ex1.cpp
/// Very simple example 1.
/// Invert a 4 x 4 matrix then check the result#define WANT_STREAM       // include iostream and iomanipulators#include "nm_src/newmatap.h"     // newmat advanced functions// should not be required for this example// included because it seems to help MS VC6// when you have namespace turned on#include "nm_src/newmatio.h"     // newmat headers including output functions#ifdef use_namespace
using namespace RBD_LIBRARIES;
#endifint my_main()                  // called by main()
{Tracer tr("my_main ");      // for tracking exceptions// declare a matrixMatrix X(4, 4);// load values row by rowX.row(1) << 3.7 << -2.1 << 7.4 << -1.0;X.row(2) << 4.1 << 0.0 << 3.9 << 4.0;X.row(3) << -2.5 << 1.9 << -0.4 << 7.3;X.row(4) << 1.5 << 9.8 << -2.1 << 1.1;// print the matrixcout << "Matrix X" << endl;cout << setw(15) << setprecision(8) << X << endl;// calculate its inverse and print itMatrix Y = X.i();cout << "Inverse of X" << endl;cout << setw(15) << setprecision(8) << Y << endl;// multiply X by its inverse and print the result (should be near identity)cout << "X * inverse of X" << endl;cout << setw(15) << setprecision(8) << (X * Y) << endl;return 0;
}// call my_main() - use this to catch exceptions
// use macros for exception names for compatibility with simulated exceptions
int main()
{Try{ return my_main(); }Catch(BaseException) { cout << BaseException::what() << "\n"; }CatchAll{ cout << "\nProgram fails - exception generated\n\n"; }return 0;
}///@}

5、先别慌运行,选中项目右键→属性→C/C++→预处理器→预处理器定义→下拉三角编辑→加入_CRT_SECURE_NO_WARNINGS

在这里插入图片描述
6、快捷键 F5 运行得到结果:
在这里插入图片描述

Chap.II 基于 CMake 使用源码

和上面比较类似,只不过需要注意如下几点:

  1. 要有#define Libxxx_LIBRARY_EXPORT __declspec(dllexport) ,并且修改newmat 的头文件,在每个类和类外函数前加修饰Libxxx_LIBRARY_EXPORT,否则会报错LNK1104 无法打开文件“..\Lib\RelWithDebInfo\Libxxxrd.lib”
  2. CMakeLists.txt 文件中要加入add_definitions(-D _CRT_SECURE_NO_WARNINGS),这样就不用进行上面第 5 步预处理器定义编辑操作了

Chap.III 编译成库

编译成库,有两种,一种是动态链接库 dll,另一种是静态库 lib,lib是编译时需要的,dll是运行时需要的。

这部分另开了一篇博文介绍,请戳我跳转

Part.III 关于矩阵的构造与运算

这部分是笔者在使用 newmat 矩阵库的时候所作的笔记。首先需要注意下面的一些信息:

  • 矩阵行列索引都是从 1 开始的
  • 不能直接把一个数组赋值给对称矩阵

Chap.I 矩阵的构造与初始化

矩阵的构造

Matrix A(m,n);					// m*n 的矩阵
RowVector RV(n);				// 1*n 的行矩阵
ColumnVector CV(n);				// n*1 的列矩阵
DiagonalMatrix D(n);			// n 维的对角阵
SymmetricMatrix S(n);			// n 维的对称阵
UpperTriangularMatrix UT(n);	// n 维的上三角矩阵
LowerTriangularMatrix LT(n);	// n 维的下三角矩阵

矩阵的初始化有多种方式,下面一一列举

1、所有元素均初始化为 0

Matrix A(m, n); 
A = 0.0;

2、通过数组初始化

Matrix A(3,2);
Real a[] = { 11,12,21,22,31,33 };
A << a;

3、给矩阵中某个元素赋值

A(i,j) << 2;

4、给矩阵中一行的元素赋值

Matrix A(3,2); 
A.Row(1) << 11 << 12;

5、拷贝赋值

A.Inject(B);			// 将 B 拷贝给 A

Chap.II 矩阵的运算

一元运算:求取矩阵的『特征』(秩、迹、行列式、范数等)

X = -A;           						// 符号取反
X = A.t();        						// 转置
X = A.i();        						// 求逆
X = A.Reverse();  						// 顺序翻转 (不适用于带状矩阵)
Real t = A.Trace();                    	// 迹
Real d = A.Determinant();			   	// 行列式
Real r = A.AsScalar();                 	// value of 1x1 matrix
Real ssq = A.SumSquare();              	// 所有元素的平方和
Real sav = A.SumAbsoluteValue();       	// 所有元素绝对值之和
Real s = A.Sum();                      	// 所有元素之和
Real norm = A.Norm1();                 	// 列范数,列向量元素绝对值之和的最大值
Real norm = A.NormInfinity();          	// 无穷范数,行向量元素绝对值之和的最大值
Real norm = A.NormFrobenius();         	// F-范数,square root of sum of squares of the elements
LogAndSign ld = A.LogDeterminant();    	// log(行列式)
bool z = A.IsZero();                   	// 判断矩阵是否所有元素都为 0
bool s = A.IsSingular();               	// A is a CroutMatrix or BandLUMatrix

二元运算:两个矩阵间作运算

X = A + B;       // 加
X = A - B;       // 减
X = A * B;       // 乘
X = A.i() * B;   // A^{-1}*B
X = A | B;       // 把 A 和 B 水平连接起来(AB行数需相等)
X = A & B;       // 把 A 和 B 竖直连接起来(AB列数需相等)
X = SP(A, B);    // A 和 B 的 schur 积(AB行列数需相等,对应元素相乘,得到一个新的矩阵)
X = KP(A, B);    // A 和 B 的 Kronecker 积(将矩阵视作向量)
Real s = DotProduct(A, B); // A 和 B 的点积(将矩阵视作向量)
bool b = A == B; // A B 是否相等
bool b = A != B; // ! (A == B)
A += B;          // A = A + B;
A -= B;          // A = A - B;
A *= B;          // A = A * B;
A |= B;          // A = A | B;
A &= B;          // A = A & B;
<, >, <=, >=     // 保持和 STL 的兼容性

Chap.III 矩阵维数和类型的更改

A.ReSize(nrows,ncols);        // for type Matrix or nricMatrix
A.ReSize(n);                  // for all other types, except Band
A.ReSize(n,lower,upper);      // for BandMatrix
A.ReSize(n,lower);            // for LowerBandMatrix
A.ReSize(n,upper);            // for UpperBandMatrix
A.ReSize(n,lower);            // for SymmetricBandMatrix
A.ReSize(B);                  // set dims to those of B A.AsRow()
A.AsColumn()
A.AsDiagonal()
A.AsMatrix(nrows,ncols)
A.AsScalar()
A.Release()						// 结构体矩阵,释放内存
m_ReleaseAndDelete()			// 指针矩阵,释放内存

Chap.IV 矩阵最值统计

使用前最好先测一下,笔者暂时没有测过。

Real mv = A.MaximumAbsoluteValue();    // 返回 A 所有元素最大的绝对值
Real mv = A.MinimumAbsoluteValue();    // 返回 A 所有元素最小的绝对值
Real mv = A.Maximum();                 // 返回 A 中最大的元素
Real mv = A.Minimum();                 // 返回 A 中最小的元素
Real mv = A.MaximumAbsoluteValue1(i);  // maximum of absolute values
Real mv = A.MinimumAbsoluteValue1(i);  // minimum of absolute values
Real mv = A.Maximum1(i);               // maximum value
Real mv = A.Minimum1(i);               // minimum value
Real mv = A.MaximumAbsoluteValue2(i,j);// maximum of absolute values
Real mv = A.MinimumAbsoluteValue2(i,j);// minimum of absolute values
Real mv = A.Maximum2(i,j);             // maximum value
Real mv = A.Minimum2(i,j);             // minimum value

Reference

  1. newmat 的简单使用
  2. newmat 官方文档
  3. C++ newmat 指北

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【避坑/个人总结】CARLA仿真遇到问题——AttributeError: module “numpy“ has no attribute “bool“

问题描述 执行以下命令时&#xff1a; ./CarlaUE4.sh -prefernvidia // 以及 ros2 launch carla_shenlan_bridge_ego_vis carla_bridge_ego_vehilce.launch.py 出现以下的问题&#xff1a; 其中的报错类型及具体为&#xff1a;AttributeError: module "numpy" has…

线下商家地图标注服务/店铺地图定位/商铺地图标注服务源码

简介&#xff1a; 前台 单店标注信息提交&#xff0c; 连锁店标注信息提交 &#xff0c;支付订单查询&#xff0c;用户问题反馈 后台 系统基本设置&#xff0c;反馈信息查看&#xff0c;订单信息管理&#xff0c;地图信息管理&#xff0c;管理员密码设置&#xff0c;集成微信…

香港科技大学广州|数据科学与分析学域硕博招生宣讲会—华东师范大学专场

时间&#xff1a;2024年4月25日&#xff08;星期四&#xff09;13:30 地点&#xff1a;华东师范大学普陀校区文附楼507 报名链接&#xff1a;https://www.wjx.top/vm/Q0cKTUI.aspx# 跨学科研究领域 *数据驱动的人工智能和机器学习 *统计学习和建模 工业和商业分析 *特定行业…

鲲鹏920RDMA应用示例代码

当前针对鲲鹏920服务器&#xff0c;编写了RDMA通信传输代码&#xff0c;首先采用TCP socket进行管理信息获取&#xff0c;然后调用verbs函数接口进行数据传输。需要安装rdma-core-devel库才可以编译 代码如下&#xff1a; /** rdma_lib.h** Created on: 2021年1月1日* A…

在Linux系统中设定延迟任务

一、在系统中设定延迟任务要求如下&#xff1a; 要求&#xff1a; 在系统中建立easylee用户&#xff0c;设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有root用户和easylee用户…

【NUCLEO-G071RB】004——GPIO-按键EXTI外部中断控制LED闪烁

NUCLEO-G071RB&#xff1a;004——GPIO-按键EXTI外部中断控制LED闪烁 设计目标电路原理图芯片配置程序修改 设计目标 电路原理图 与NUCLEO-G071RB&#xff1a;003——GPIO-按键控制LED灯相同 芯片配置 1、PC13&#xff08;B1&#xff09;&#xff1a;EXTI外部中断模式&…

Linux LVM 逻辑卷管理

Logical Volume Manager&#xff0c;逻辑卷管理 能够在保持现有数据不变的情况下动态调整磁盘容量&#xff0c;从而提高磁盘管理的灵活性/boot分区用于存放引导文件&#xff0c;不能基于LVM创建 三大概念&#xff1a; 物理卷PV基于硬盘或分区设备创建而来&#xff0c;生成N多…

基于SpringBoot的“滴答拍摄影项目”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“滴答拍摄影项目”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 滴答拍摄影项目结构图 管理员登录首页界面图 用…

【Linux】git

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux的编译器-gcc/g&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1.安装git2.在gitee上创建仓库3.首次配置4.下载仓库到本地5.三板斧6.git log7.gi…

待研究技术

Fabric.js H5 Canvas的js库 Fabric.js是一个用于创建交互式的HTML5 Canvas应用程序的JavaScript库。它提供了一个简单而强大的API&#xff0c;用于在Web浏览器中绘制和操作图形对象。Fabric.js可以用于创建各种图形应用程序&#xff0c;例如绘图编辑器、图像编辑器、流程图、地…

JavaSE-13笔记【集合2(+2024新)】

文章目录 3.Map3.1 Map继承结构3.2 Map接口的常用方法3.3 遍历Map3.4 HashMap集合3.4.1 HashMap集合key的特点3.4.2 HashMap集合的key存储自定义类型3.4.3 哈希表3.4.3.1 哈希表的介绍3.4.3.2 哈希表的存储原理 3.4.4 存放在HashMap和HashSet集合key部分的元素必须同时重写hash…

2024年在Vim中开发vue2+java

neovim 0.5刚出来的时代&#xff0c;那时刚有lua插件我很狂热。每天沉迷于打造自己的IDE之中。写过一堆相关的博客&#xff0c;也录过一些视频教程。后来发现neovim的接口和插件更新的很快&#xff0c;导致配置文件要不定期的修改&#xff0c;才能保证新版本的插件的适配。我也…

理解思维链Chain of Thought(CoT)

Chain of Thought&#xff08;CoT&#xff09;&#xff0c;即“思维链”&#xff0c;是人工智能领域中的一个概念&#xff0c;特别是在自然语言处理和推理任务中。它指的是一种推理过程&#xff0c;其中模型在生成最终答案之前&#xff0c;先逐步推导出一系列的中间步骤或子目标…

部署Zabbix5.0

一.部署zabbix客户端 端口号10050 zabbix 5.0 版本采用 golang 语言开发的新版本客户端 agent2 。 zabbix 服务端 zabbix_server 默认使用 10051 端口&#xff0c;客户端 zabbix_agent2 默认使用 10050 端口。 1.1.关闭防火墙和selinux安全模块 systemctl disable --now fir…

json diff patch

文件和图片的比对靠字符串 目录 流程 安装 效果 使用 自适应 数组&#xff1a;最长公共子序列(LCS) 数组中的对象&#xff0c;给定id&#xff0c;类似dom tree的比较 流程 安装 npm install jsondiffpatch import * as jsondiffpatch from jsondiffpatch; const jsond…

Vue3(六):Vue3其他API、Vue3新组件Teleport、Vue2和3区别

一、其他API 1.shallowRef 与 shallowReactive &#xff08;1&#xff09;shallowRef 1. 作用&#xff1a;创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理。 2.用法&#xff1a; let myVar shallowRef(initialValue); 3. 特点&#xff1a;只跟踪引用值的变化&…

IntelliJ IDEA配置类注释模板和方法注释模板

配置类注释模板和方法注释模板 IDEA模板预定义变量类注释模方法注释模板方法参数优化 IDEA模板 在IDEA中&#xff0c;自带的注释模板可能不满足自身需求或者不满意&#xff0c;此时可以通过配置IDEA模板来解决。 预定义变量 内置模板是可编辑的&#xff0c;除了静态文本、代码和…

react中关于类式组件和函数组件对props、state、ref的使用

文章中有很多蓝色字体为扩展链接&#xff0c;可以补充查看。 常用命令使用规则 组件编写方式: 1.函数式 function MyButton() { //直接return 标签体return (<>……</>); }2.类 class MyButton extends React.Component { //在render方法中&#xff0c;return…

GPT-3.5和GPT-Plus的区别

GPT-3.5和GPT-Plus都是OpenAI开发的大型语言模型,但它们之间有一些区别: GPT-3.5就是大家熟知的ChatGPT GPT-Plus 是Open AI 的更强的AI模型GPT-4版本。两者区别是&#xff1a; 模型规模:GPT-Plus是GPT-3的一个更大版本,参数量更多。而GPT-3.5是GPT-3的一个优化版本,在参数量…

基于Copula函数的风光功率联合场景生成_任意修改生成的场景数目(附带Matlab代码)

基于Copula函数的风光功率联合场景生成 削减为6个场景 部分展示削减为5个场景 部分展示 风光等可再生能源出力的不确定性和相关性给系统的设计带来了极大的复杂性&#xff0c;若忽略这些因素&#xff0c;势必会在系统规划阶段引入次优决策风险。因此&#xff0c;在确定系统最佳…