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;
#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 指北

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可视化大屏的应用(11):智慧运维领域的得力助手

一、什么是智慧运维 智慧运维&#xff08;Smart Operations and Maintenance&#xff0c;简称智慧运维&#xff09;是一种利用先进的信息技术和数据分析手段&#xff0c;对设备、设施或系统进行监测、分析和优化管理的运维方式。它通过实时监测数据、智能分析和预测&#xff0…

【汇编语言实战】两个32位数的相加运算

C语言描述&#xff1a; #include <stdio.h> int main() { int a3,b2; printf("%d",ab); }汇编语言&#xff1a; include irvine32.inc .data a dword 32 b dword 33 .code main proc mov eax,a mov ebx,b add eax,ebx call writeint main endp end main运行结…

【Package Marking】UG475 FPGA 芯片丝印解析 AMD XILINX

Spartan 7 Devices Kintex 7 Device Virtex 7 Device 说明 条目定义Xilinx LogoXilinx 徽标、带有商标的 Xilinx 名称和商标注册状态。Pb-free Character对于 FFG、FBG 或 SBG 封装&#xff0c;器件右上角标有无铅字符&#xff0c;表示该器件使用无铅材料组制造&#xff0c;如…

Qt之QSS样式表

QSS简介 QSS&#xff08;Qt Style Sheet&#xff09;样式表是一种用于描述图形用户界面&#xff08;GUI&#xff09;样式的语言。它允许开发者为应用程序的控件定义视觉外观&#xff0c;例如颜色、字体、尺寸和布局等。 QSS 样式表的主要目的是提供一种简洁而灵活的方式来美化…

Java毕业设计 基于springboot vue撸宠平台 宠物系统

Java毕业设计 基于springboot vue撸宠平台 宠物系统 springboot撸宠平台 宠物系统 功能介绍 首页 图片轮播 用户或商家注册 用户或商家登录 登录验证码 店铺信息 店铺详情 店铺投诉 宠物信息 宠物详情 预订 退订 搜索 收藏 点赞 踩 评论 个人中心 更新信息 我的收藏 在线客服…

一文2500字从0到1使用JMeter进行接口测试教程!

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Cho…

【vim 学习系列文章 22 -- vim 实现 linux 多行快速标准注释】

文章目录 vim 实现 linux 多行快速标准注释 vim 实现 linux 多行快速标准注释 不多说了&#xff0c;直接上动图&#xff1a; 上代码&#xff1a; function! CommentBlock()" 获取Visual模式选中的起始和结束行号let old_start_line line("<")let old_end…

多语言婚恋交友APP开发流程一览

近年来&#xff0c;随着全球化的发展和人们对跨文化交流的需求增加&#xff0c;多语言婚恋交友APP的需求逐渐增长。开发这类APP需要考虑到不同语言和文化下用户的需求&#xff0c;涉及到一系列独特的流程和挑战。本文将从专家角度为您解析多语言婚恋交友APP的开发流程&#xff…

[leetcode]maximum-width-of-binary-tree

. - 力扣&#xff08;LeetCode&#xff09; 给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即&#xff0c;两个端点&#xff09;之间的长度。将这个二叉…

解锁电商增长密码:山海鲸智慧电商解决方案全解析

在数字化浪潮席卷全球的今天&#xff0c;电商行业作为其中的重要一环&#xff0c;正面临着前所未有的机遇与挑战。如何在这个充满变革与创新的领域中脱颖而出&#xff0c;成为了众多电商企业关注的焦点。山海鲸智慧电商解决方案&#xff0c;以其前瞻性的技术布局和丰富的实战经…

晶核攻略:新手快速入门攻略,游戏必备!

欢迎来到阿特兰世界&#xff0c;冒险者&#xff01;在这个充满魔导朋克魅力的箱庭式动作RPG游戏中&#xff0c;你将扮演冒险家协会的一员&#xff0c;探索世界能量之源晶核的秘密。但作为新手&#xff0c;面对繁多的副本和职业技能&#xff0c;可能会感到有些手足无措。不过别担…

web APIs总结(1)

1. 根据CSS选择器来获取DOM元素 (重点&#xff09; 获取一个DOM元素我们使用谁&#xff1f;能直接操作修改吗&#xff1f;querySelector() 可以返回值&#xff1a;CSS选择器匹配的第一个元素,一个 HTMLElement对象。如果没有匹配到&#xff0c;则返null 获取多个DOM元素我们使…

【随笔】Git 高级篇 -- 快速定位分支 ^|~(二十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

VBA 制作二维码

假设从B1单元格取值&#xff0c;在A1单元格中生成二维码&#xff0c; 那么&#xff0c;代码如下↓ Sub genBarCode()清除已有二维码Call clearBarCodeWith ActiveSheet.OLEObjects.Add(ClassType:"BARCODE.BarCodeCtrl.1").Object.Style 11 二维码样式.Object.V…

关于鸿蒙HarmonyOS,现在关注什么可以更高效

对于移动端来讲&#xff0c;今年最火的关键词除了裁员&#xff0c;我想就是鸿蒙HarmonyOS了。其实鸿蒙的推出也给安卓端的同学提供了职业发展的新路径或方向。 鸿蒙&#xff0c;原本源自中国神话传说的名字&#xff0c;如今已成为了科技领域的焦点&#xff0c;招聘网站上也出现…

关于DNS解析那些事儿,了解DNS解析的基础知识

DNS&#xff0c;全称Domain Name System域名系统&#xff0c;是一个将域名和IP地址相互映射的一个分布于世界各地的分布式数据库&#xff0c;而DNS解析就是将域名转换为IP地址的过程&#xff0c;使人们可以轻松实现通过域名访问网站。DNS解析是网站建设非常关键的一步&#xff…

wireshark数据流分析学习日记day3-从 Pcap 导出对象

从 HTTP 流量导出文件 过滤http请求 发现get请求上传了两个文件 保存即可 也可以保存网页 点击保存 改文件名为html结尾以便于访问 请谨慎使用此方法。如果从 pcap 中提取恶意 HTML 代码并在 Web 浏览器中查看它&#xff0c;则 HTML 可能会调用恶意域&#xff0c;这就是为什么…

JavaWeb中的Servlet是什么?怎么使用?

文章目录 一、什么是Servlet二、Servlet的基本内容1、Servlet的作用2、Servlet接口3、Servlet接口实现类4、Servlet接口实现类开发步骤5、Servlet对象生命周期6、HttpServletResquest接口7、HttpServletResponse接口8、请求对象和响应对象流程图9、请求对象和响应对象生命周期1…

一分钟实现python对dataframe的某列进行一个范围值的挑选

1、解释&#xff1a;在Python 中 可以使用 pandas.DataFrame.loc和 numpy.where来实现 2、示例&#xff1a; 假设我们有一个名为data_cloud的DataFrame&#xff0c;其中有一列名为cloud&#xff0c;我们想要筛选出cloud列中值为在20~80范围的所有行。可以使用以下代码实现&…

学习Rust的第二天:Cargo

We dive into Cargo, the powerful and convenient build system and package manager for Rust. 基于Steve Klabnik的《The Rust Programming Language》一书&#xff0c;我们深入了解Cargo&#xff0c;这是Rust强大而方便的构建系统和包管理器。 Cargo is a robust and effic…