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

news2024/10/5 16:32:34

文章目录

  • 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;
#endif


int my_main()                  // called by main()
{
    Tracer tr("my_main ");      // for tracking exceptions

    // declare a matrix
    Matrix X(4, 4);

    // load values row by row
    X.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 matrix
    cout << "Matrix X" << endl;
    cout << setw(15) << setprecision(8) << X << endl;

    // calculate its inverse and print it
    Matrix 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.coloradmin.cn/o/1602696.html

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

相关文章

Spring容器结构

文章目录 1.基本介绍1.Spring5官网2.API文档3.Spring核心学习内容4.几个重要概念 2.快速入门1.需求分析2.入门案例1.新建Java项目2.导入jar包3.编写Monster.java4.src下编写Spring配置文件1.创建spring配置文件&#xff0c;名字随意&#xff0c;但是需要放在src下2.创建Spring …

蓝桥杯(基础题)

试题 C: 好数 时间限制 : 1.0s 内存限制: 256.0MB 本题总分&#xff1a;10 分 【问题描述】 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上 的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &…

张大哥笔记:电脑周边的10大刚需创业小项目

hello&#xff0c;大家好&#xff0c;我是张大哥&#xff0c;今天一口气给大家分享围绕电脑周边的10大刚需创业小项目&#xff0c;本文章旨在帮助大家如何快速切入到细分领域里面搞钱&#xff01; 如何赚钱&#xff0c;无非就是解决人群痛点&#xff0c;你要懂得根据用户痛点去…

知识跟踪模型GraphKT

1 知识跟踪Knowledge Tracing的概念 知识跟踪可以用来解决自适应学习问题。如何通过与教学材料的在线互动来有效地跟踪学生的学习进展&#xff1f;知识跟踪可用于量化学生的知识状态&#xff0c;即对教材所涉及的技能掌握水平。用于评估和模拟学生随着时间推移对技能的认知掌握…

双指针的引入和深入思考(持续更新中)

目录 1.引入双指针 2.使用场景 3.例题引入 1.引入双指针 当我们需要维护某个区间性质的或者是求满足某些性质的区间的长度时&#xff0c;对于一个区间是由左右端点的&#xff0c;我们有简单的枚举左右端点的O()的时间的做法&#xff0c;当时在大多数题目中是不可行的&#…

4核8G配置服务器多少钱?2024年阿里云服务器700元1年价格便宜

4核8G配置服务器多少钱&#xff1f;2024年阿里云服务器700元1年价格便宜。阿里云4核8G服务器租用优惠价格700元1年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采…

Java设计模式——代理模式

静态代理&#xff1a; Java静态代理是设计模式中的一种&#xff0c;它通过创建一个代理类来代替原始类&#xff0c;从而提供额外的功能或控制原始类的访问。 如何使用Java静态代理 要创建一个静态代理&#xff0c;你需要有一个接口&#xff0c;一个实现该接口的目标类&#…

Python pyglet制作彩色圆圈“连连看”游戏

原文链接&#xff1a; Python 一步一步教你用pyglet制作“彩色方块连连看”游戏(续)-CSDN博客文章浏览阅读1.6k次&#xff0c;点赞75次&#xff0c;收藏55次。上期讲到相同的色块连接&#xff0c;链接见&#xff1a; Python 一步一步教你用pyglet制作“彩色方块连连看”游戏-…

Java中的容器

Java中的容器主要包括以下几类&#xff1a; Collection接口及其子接口/实现类&#xff1a; List 接口及其实现类&#xff1a; ArrayList&#xff1a;基于动态数组实现的列表&#xff0c;支持随机访问&#xff0c;插入和删除元素可能导致大量元素移动。LinkedList&#xff1a;基…

【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题

文章目录 一、什么是时间复杂度和空间复杂度&#xff1f;1.1 算法效率1.2 时间复杂度的概念1.3 空间复杂度的概念1.4 复杂度计算在算法中的意义 二、时间复杂度的计算2.1 大O渐进表示法2.2 常见时间复杂度计算举例 三、空间复杂度的计算四、Leetcode刷题1. 消失的数2. 旋转数组…

对接实例:致远OA对接金蝶云星空场景解决方案

正文&#xff1a;很多企业在数字化建设得时候&#xff0c;对内部系统间的高效协同与数据流转提出了更高要求。金蝶云星空作为行业领先的ERP解决方案&#xff0c;与专业协同办公平台致远OA的深度对接&#xff0c;在人员管理、组织架构、采购与销售合同、费用审批等在内的全方位企…

javaWeb项目-网上图书商城系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java技术 Java语…

Flask框架初探-如何在本机发布一个web服务并通过requests访问自己发布的服务-简易入门版

Flask框架初探 在接触到网络框架之前我其实一直对一个事情有疑惑&#xff0c;跨语言的API在需要传参的情况下究竟应该如何调用&#xff0c;之前做过的项目里&#xff0c;我用python做了一个代码使用一个算法得到一个结果之后我应该怎么给到做前端的同学或者同事&#xff0c;之前…

2024腾讯一道笔试题--大小写字母移动

题目&#x1f357; 有一个字符数组,其中只有大写字母和小写字母,将小写字母移到前面, 大写字符移到后面,保持小写字母本身的顺序不变,大写字母本身的顺序不变, 注意,不要分配新的数组.(如:wCelOlME,变为wellCOME). 思路分析&#x1f357; 类似于冒泡排序&#xff0c;两两比较…

JavaSE中的String类

1.定义方式 常见的三种字符串构造 public class Test1 {public static void main(String[] args) {// 使用常量串构造String str1 "abc";System.out.println(str1);// 直接newString对象String str2 new String("ABC");System.out.println(str2);// 使用…

ssm056基于Java语言校园快递代取系统的设计与实现+jsp

校园快递代取系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园快递代取系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

node基础 第二篇

01 ffmpeg开源跨平台多媒体处理工具&#xff0c;处理音视频&#xff0c;剪辑&#xff0c;合并&#xff0c;转码等 FFmpeg 的主要功能和特性:1.格式转换:FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式&#xff0c;支持几乎所有常见的音频和视频格式&#xff0c;包括 MP…

工业控制(ICS)---OMRON

OMRON FINS 欧姆龙厂商 命令代码(Command CODE)特别多&#xff0c;主要关注读写相关&#xff0c;如&#xff1a; Memory Area Read (0x0101) Memory Area Write (0x0102) Multiple Memory Area Read (0x0104) Memory Area Transfer (0x0105) Parameter Area Read (0x0201) Pa…

ARM_day8:温湿度数据采集应用

1、IIC通信过程 主机发送起始信号、主机发送8位(7位从机地址1位传送方向(0W&#xff0c;1R))、从机应答、发数据、应答、数据传输完&#xff0c;主机发送停止信号 2、起始信号和终止信号 SCL时钟线&#xff0c;SDA数据线 SCL高电平&#xff0c;SDA由高到低——起始信号 SC…

Linux时间同步练习

题目如下&#xff1a; 一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为&#xff1a; 172.25.254.100 3.server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 4.配置server主机的时间同步服务要求可以被所…