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

C++精解【7】

文章目录

  • eigen
    • 矩阵初始化
      • 多维矩阵
      • 矩阵和向量size
      • 固定大小or 动态大小
      • Matrix类六个模板参数
      • 初始化向量
      • 元素类型
  • 参考文献

eigen

矩阵初始化

多维矩阵

  • 数组
MatrixXi a {      // construct a 2x2 matrix{1, 2},     // first row{3, 4}      // second row
};
Matrix<double, 2, 3> b {{2, 3, 4},{5, 6, 7},
};
#include <iostream>
#include "f:/learn/eigen-3.4.0/Eigen/Dense"using Eigen::Matrix;
int main()
{Matrix<int,3,2> a {{1, 2}, {3, 4}, {5, 6}};std::cout << a<< std::endl;
}
1 2
3 4
5 6Process returned 0 (0x0)   execution time : 0.117 s
Press any key to continue.
  • 重定向操作符
Matrix3f m;
m << 1, 2, 3,4, 5, 6,7, 8, 9;
std::cout << m;
1 2 3
4 5 6
7 8 9

矩阵和向量size

  • rows:矩阵行
  • cols:矩阵列
  • resize:重新规划size
#include <iostream>
#include "e:/eigen/Eigen/Dense"
using namespace std;
using namespace Eigen;
int main()
{MatrixXf m(2,5);cout << "The matrix m is of size "<< m.rows() << "x" << m.cols() << std::endl;m.resize(4,3);cout << "The matrix m resized is of size "<< m.rows() << "x" << m.cols() << std::endl;cout << "It has " << m.size() << " coefficients" << std::endl;VectorXf v(2);cout << "The vector v is of size " << v.size() << std::endl;v.resize(5);cout << "The vector v resized is of size " << v.size() << std::endl;cout << "As a matrix, v is of size "<< v.rows() << "x" << v.cols() << std::endl;
}
The matrix m is of size 2x5
The matrix m resized is of size 4x3
It has 12 coefficients
The vector v is of size 2
The vector v resized is of size 5
As a matrix, v is of size 5x1Process returned 0 (0x0)   execution time : 0.317 s
Press any key to continue.

固定大小or 动态大小

什么时候应该使用固定大小(例如Matrix4f),什么时候应该使用动态大小(例如MatrixXf)?

  • 简单的答案是:对于非常小的尺寸尽可能使用固定大小,对于较大的尺寸或必须使用动态大小。对于较小的大小,特别是小于(大约)16的大小,使用固定大小对性能非常有益,因为它允许Eigen避免动态内存分配并展开循环。
  • 当然,使用固定大小的限制是,只有在编译时知道大小时才有可能。此外,对于足够大的大小,例如大于(大约)32的大小,使用固定大小的性能优势变得可以忽略不计。
  • 更糟糕的是,尝试在函数内部使用固定大小创建一个非常大的矩阵可能会导致堆栈溢出,因为Eigen会尝试将数组自动分配为局部变量,而这通常是在堆栈上完成的。

Matrix类六个模板参数

  • 模板参数
Matrix<typename Scalar,int RowsAtCompileTime,int ColsAtCompileTime,int Options = 0,int MaxRowsAtCompileTime = RowsAtCompileTime,int MaxColsAtCompileTime = ColsAtCompileTime>
  • Options是位字段。
    RowMajor。它指定这种类型的矩阵使用行为主存储顺序;默认情况下,存储顺序是以列为主的。请参阅存储订单页面。例如,此类型表示行为主的3x3矩阵:
  Matrix<float, 3, 3, RowMajor>
  • MaxRowsAtCompileTime和MaxColsAtCompileTime
    在需要指定时非常有用,即使在编译时不知道矩阵的确切大小,但在编译时知道一个固定的上限。这样做的最大原因可能是为了避免动态内存分配。例如,下面的矩阵类型使用12个浮点数的普通数组,没有动态内存分配
Matrix<float, Dynamic, Dynamic, 0, 3, 4>
  • 存储顺序详解
    矩阵和二维数组有两种不同的存储顺序:列为主和行为主
    当矩阵存储在内存中时,条目必须以某种方式线性排列。有两种主要的方法可以做到这一点,按行和按列。
  1. 如果一个矩阵是逐行存储的,我们就说它是按行主序存储 row-major的。首先存储整个第一行,然后是整个第二行,依此类推。以矩阵为例
    在这里插入图片描述
8 2 2 9 9 1 4 4 3 5 4 5 
  1. 如果一个矩阵是按列存储 column-major 的,那么它是以列为主顺序存储的,从整个第一列开始,然后是整个第二列,依此类推。若将上述矩阵按列主序存储,则其布局如下:
8 9 3 2 1 5 2 4 4 9 4 5 

3、例
定义一个4*3的矩阵A,然后分别以按行或按列存储。
使用PlainObjectBase::data()函数,该函数返回指向矩阵第一个条目的内存位置的指针。

#include <iostream>
#include "e:/eigen/Eigen/Dense"
using namespace std;
using namespace Eigen;
int main()
{Matrix<int, 4, 3, ColMajor> Acolmajor;Acolmajor << 1,2,3,4,5,6,7,8,9,10,11,12;cout << "The matrix A:" << endl;cout << Acolmajor << endl << endl;cout << "In memory (column-major):" << endl;for (int i = 0; i < Acolmajor.size(); i++)cout << *(Acolmajor.data() + i) << "  ";cout << endl << endl;Matrix<int, 4, 3, RowMajor> Arowmajor = Acolmajor;cout << "In memory (row-major):" << endl;for (int i = 0; i < Arowmajor.size(); i++)cout << *(Arowmajor.data() + i) << "  ";cout << endl;
}
The matrix A:1  2  34  5  67  8  9
10 11 12In memory (column-major):
1  4  7  10  2  5  8  11  3  6  9  12In memory (row-major):
1  2  3  4  5  6  7  8  9  10  11  12Process returned 0 (0x0)   execution time : 0.404 s
Press any key to continue.
  • Matrix类模板有六个模板参数,其中三个是强制性的(Scalar, RowsAtCompileTime和ColsAtCompileTime),另外三个是可选的(Options, MaxRowsAtCompileTime和MaxColsAtCompileTime)。如果Options参数设置为RowMajor,则矩阵或数组按行主要顺序存储;如果设置为ColMajor,则按列主顺序存储。该机制在上述特征程序中用于指定存储顺序。

  • 如果未指定存储顺序,则Eigen默认以列为主的方式存储条目。如果使用方便类型(Matrix3f、ArrayXXd等)之一,也会出现这种情况。

  • 使用一种存储顺序的矩阵和数组可以分配给使用另一种存储顺序的矩阵和数组,就像上面的程序中使用Acolmajor初始化Arowmajor时发生的那样。Eigen将自动重新排序条目。更一般地说,行为主矩阵和列为主矩阵可以在表达式中混合使用。

  • 您应该在程序中使用哪种存储顺序呢?这个问题没有简单的答案;这取决于您的应用程序。以下是一些需要牢记的要点:

1.您的用户可能希望您使用特定的存储顺序。或者,您可以使用Eigen以外的其他库,这些库可能需要特定的存储顺序。在这些情况下,在整个程序中使用这种存储顺序可能是最简单和最快的。
2.当矩阵以行为主的顺序存储时,由于更好的数据局部性,逐行遍历矩阵的算法将运行得更快。类似地,对于列主矩阵,逐列遍历更快。为了找出适合您的特定应用程序的更快的方法,进行一些实验可能是值得的。
3.缺省情况下,Eigen是列为主的。自然地,大多数特征库的开发和测试都是用列主矩阵完成的。这意味着,尽管我们的目标是透明地支持列为主和行为主的存储顺序,但Eigen库可能最适合列为主的矩阵。

初始化向量

#include <iostream>
#include "f:/learn/eigen-3.4.0/Eigen/Dense"using Eigen::VectorXd;
using Eigen::RowVectorXd;
int main()
{VectorXd a {{1.5, 2.5, 3.5}};RowVectorXd b {{1.0, 2.0, 3.0, 4.0}};std::cout << a<< std::endl;std::cout << b<< std::endl;
}
1.5
2.5
3.5
1 2 3 4Process returned 0 (0x0)   execution time : 0.110 s
Press any key to continue.

元素类型

MatrixNt for Matrix<type, N, N>. For example, MatrixXi for Matrix<int, Dynamic, Dynamic>.
MatrixXNt for Matrix<type, Dynamic, N>. For example, MatrixX3i for Matrix<int, Dynamic, 3>.
MatrixNXt for Matrix<type, N, Dynamic>. For example, Matrix4Xd for Matrix<d, 4, Dynamic>.
VectorNt for Matrix<type, N, 1>. For example, Vector2f for Matrix<float, 2, 1>.
RowVectorNt for Matrix<type, 1, N>. For example, RowVector3d for Matrix<double, 1, 3>.
  • N可以是2、3、4或X中的任意一个(表示动态)。
  • T可以是I (int)、f (float)、d (double)、cf (complex)或CD (complex)中的任意一个。虽然只为这五种类型定义了类型定义,但这并不意味着它们是唯一受支持的标量类型

参考文献

  1. Eigen

相关文章:

C++精解【7】

文章目录 eigen矩阵初始化多维矩阵矩阵和向量size固定大小or 动态大小Matrix类六个模板参数初始化向量元素类型 参考文献 eigen 矩阵初始化 多维矩阵 数组 MatrixXi a { // construct a 2x2 matrix{1, 2}, // first row{3, 4} // second row }; Matrix<do…...

堆箱子00

题目链接 堆箱子 题目描述 注意点 将箱子堆起来时&#xff0c;下面箱子的宽度、高度和深度必须大于上面的箱子 解答思路 初始想到深度优先遍历&#xff0c;最后超时了参照题解使用动态规划&#xff0c;先将盒子从小到大进行排序&#xff0c;dp[i]存储的是到第i个箱子时堆箱…...

Linux 命令:iftop

1. 写在前面 本文主要介绍 Linux iftop&#xff08;Interface TOP&#xff09; 命令&#xff1a;iftop 是一款小巧、免费且功能强大的网卡实时流量监控工具。监控指定网卡的实时流量、端口连接信息、反向解析 IP 等&#xff0c;还可以精确显示本机网络流量及网络内各主机和本机…...

web学习笔记(六十九)vue2

目录 1. vue2创建脚手架项目 2.vue2如何关闭eslint 1. vue2创建脚手架项目 &#xff08;1&#xff09;在cmd窗口输入npm install -g vue/cli命令行&#xff0c;快速搭建脚手架。 &#xff08;2&#xff09; 创建vue2项目 &#xff08;3&#xff09; 选择配置项目&#xff0c…...

JavaScript全解:从基础到高级,掌握每一个知识点

引言&#xff1a; JavaScript是一种广泛使用的脚本语言&#xff0c;主要用于Web浏览器&#xff0c;但近年来也扩展到了服务器端&#xff08;Node.js&#xff09;和其他领域。它允许开发者创建交互式的网页&#xff0c;处理数据&#xff0c;控制用户界面&#xff0c;甚至构建完…...

RabbitMQ的Direct交换机

Direct交换机 BindingKey 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下&#xff1a; 队列与交换机的绑定&a…...

2024.6.26 待学习知识点

OOALV https://www.cnblogs.com/BruceKing/p/11447499.html " 取工单的组件 lt_aufnr CORRESPONDING #( lt_out MAPPING aufnr aufnr EXCEPT * ). ABAP POPUP_TO_CONFIRM 弹出框函数 CLASS-EVENTS CLASS-METHODS main. CLASS-METHODS raise_event_EXIT_COMMAND IMPOR…...

【LeetCode】每日一题:相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&am…...

6.26.1 残差卷积变压器编码器的混合工作流程用于数字x线乳房x光片乳腺癌分类

基于残差卷积网络和多层感知器变压器编码器(MLP)的优势&#xff0c;提出了一种新型的混合深度学习乳腺病变计算机辅助诊断(CAD)系统。利用骨干残差深度学习网络创建深度特征&#xff0c;利用Transformer根据自注意力机制对乳腺癌进行分类。所提出的CAD系统具有识别两种情况乳腺…...

[leetcode]avoid-flood-in-the-city 避免洪水泛滥

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> avoidFlood(vector<int>& rains) {vector<int> ans(rains.size(), 1);set<int> st;unordered_map<int, int> mp;for (int i 0; i < rains.size(); i) {i…...

Pytorch基础

文章目录 零、tensorboard0.1基本使用案例 一、数据结构&#xff1a;Tensor1.1数据类型1.2Tensor的创建方式1.3张量的基本运算1.4张量的属性 二、数据集加载器DataLoaders2.0前置知识2.0.1torch.scatter()、torch.scatter_() 2.1官方案例2.1.1从TorchVision加载数据集2.1.2迭代…...

嵌入技术Embedding

嵌入&#xff08;Embedding&#xff09;是一种将高维数据映射到低维空间的技术&#xff0c;广泛应用于自然语言处理&#xff08;NLP&#xff09;、计算机视觉和推荐系统等领域。嵌入技术的核心思想是将复杂的数据表示为低维向量&#xff0c;使其在这个低维空间中保留尽可能多的…...

Pandas中的数据转换[细节]

今天我们看一下Pandas中的数据转换&#xff0c;话不多说直接开始&#x1f387; 目录 一、⭐️apply函数应用 apply是一个自由度很高的函数 对于Series&#xff0c;它可以迭代每一列的值操作&#xff1a; 二、⭐️矢量化字符串 为什么要用str属性 替换和分割 提取子串 …...

vue2面试题——路由

1. 路由的模式和区别 路由的模式&#xff1a;history&#xff0c;hash 区别&#xff1a; 1. 表象不同 history路由&#xff1a;以/为结尾&#xff0c;localhost:8080——>localhost:8080/about hash路由&#xff1a;会多个#&#xff0c;localhost:8080/#/——>localhost:…...

【AI应用探讨】—朴素贝叶斯应用场景

目录 文本分类 推荐系统 信息检索 生物信息学 金融领域 医疗诊断 其他领域 文本分类 垃圾邮件过滤&#xff1a;朴素贝叶斯被广泛用于垃圾邮件过滤任务&#xff0c;通过邮件中的文本内容来识别是否为垃圾邮件。例如&#xff0c;它可以基于邮件中出现的单词或短语的概率来…...

使用matlab的大坑,复数向量转置!!!!!变量区“转置变量“功能(共轭转置)、矩阵转置(默认也是共轭转置)、点转置

近期用verilog去做FFT相关的项目&#xff0c;需要用到matlab进行仿真然后和verilog出来的结果来做对比&#xff0c;然后计算误差。近期使用matlab犯了一个错误&#xff0c;极大的拖慢了项目进展&#xff0c;给我人都整emo了&#xff0c;因为怎么做仿真结果都不对&#xff0c;还…...

昇思25天学习打卡营第8天|保存与加载

1. 学习内容复盘 1.1 保存与加载 上一章节主要介绍了如何调整超参数&#xff0c;并进行网络模型训练。在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;本章…...

【vueUse库Animation模块各函数简介及使用方法】

vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseAnimation函数1. useInter…...

汇川H5u小型PLC作modbusRTU从站设置及测试

目录 新建工程COM通讯参数配置协议选择协议配置 查看手册Modbus地址对应关系仿真测试 新建工程 新建一个H5U工程&#xff0c;不使用临时工程 系列选择H5U即可 COM通讯参数配置 协议选择 选择ModbusRTU从站 协议配置 端口号默认不可选择 波特率这里使用9600 数据长度&…...

基于Java的多元化智能选课系统-计算机毕业设计源码040909

摘 要 多元化智能选课系统使用Java语言的Springboot框架&#xff0c;采用MVVM模式进行开发&#xff0c;数据方面主要采用的是微软的Mysql关系型数据库来作为数据存储媒介&#xff0c;配合前台技术完成系统的开发。 论文主要论述了如何使用JAVA语言开发一个多元化智能选课系统&a…...

从零上手CircuitJS1:开源电路仿真工具的核心功能与实战演练

1. 初识CircuitJS1&#xff1a;浏览器里的电子实验室 第一次打开CircuitJS1时&#xff0c;我仿佛回到了大学电子实验室——只不过这次所有仪器都装进了浏览器窗口。这个完全开源的工具用JavaScript重构了经典的Falstad电路模拟器&#xff0c;不需要安装任何插件就能在Chrome或…...

保姆级教程:在Windows 10上搞定QGroundControl 4.2源码编译与打包(附VS+QT配置)

Windows 10下QGroundControl 4.2开发环境全栈搭建指南 第一次接触无人机地面站开发时&#xff0c;我被QGroundControl强大的功能所吸引&#xff0c;但配置开发环境的过程却让我踩了不少坑。从VS安装版本选择到QT组件配置&#xff0c;再到最后的打包发布&#xff0c;每个环节都可…...

3D Tiles-Tools实战指南:如何高效处理大规模地理空间3D数据转换?

3D Tiles-Tools实战指南&#xff1a;如何高效处理大规模地理空间3D数据转换&#xff1f; 【免费下载链接】3d-tiles-tools 项目地址: https://gitcode.com/gh_mirrors/3d/3d-tiles-tools 在数字孪生、智慧城市和地理信息系统领域&#xff0c;大规模3D地理空间数据的高效…...

GPT-5.5推理效率优化背后的5个核心技术突破

概要GPT-5.5是OpenAI于2026年4月23日发布的旗舰模型&#xff0c;代号"Spud"。最近在库拉&#xff08;c.877ai.cn&#xff09;AI工具聚合平台上做了集中测试&#xff0c;GPT-5.5的推理效率提升不是单一优化的结果&#xff0c;而是五个核心技术方向同时突破。从数据看&…...

实战 | 性能瓶颈无处遁形,揭秘 mPaaS 全链路压测的落地策略与调优秘籍

1. 从性能焦虑到精准定位&#xff1a;为什么需要全链路压测&#xff1f; 第一次接手移动应用性能优化项目时&#xff0c;我盯着监控大屏上跳动的红色警报线手足无措。用户投诉像雪片般飞来&#xff1a;"支付页面卡死"、"图片加载转圈半分钟"、"活动页…...

死锁四大必要条件解析

好的&#xff0c;针对“死锁考点与高频面试题”&#xff0c;我将直接进行核心内容解构与推演&#xff0c;并生成符合规范的答案。死锁是多线程并发编程中的核心难点与高频考点&#xff0c;其核心围绕定义、条件、场景、检测、预防与避免展开。一、 死锁核心定义与必要条件死锁是…...

两级宽带反馈放大器设计与优化方法

1. 两级宽带反馈放大器设计概述在当今高速通信和信号处理系统中&#xff0c;宽带放大器作为关键模拟模块&#xff0c;其性能直接影响整个系统的信号完整性。传统的手工设计方法在面对现代SoC日益复杂的性能需求时显得力不从心&#xff0c;特别是在需要同时满足增益、带宽、噪声…...

智慧工地起重机吊钩检测数据集VOC+YOLO格式1138张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;1138标注数量(xml文件个数)&#xff1a;1138标注数量(txt文件个数)&#xff1a;1138标注类别…...

移动端数据抓取实战:基于Capacitor插件实现自动化采集

1. 项目概述&#xff1a;一个为移动端设计的“数据抓手”最近在做一个移动端的数据采集项目&#xff0c;需要从一些应用里提取特定的信息。直接写原生代码去解析页面结构&#xff0c;不仅开发周期长&#xff0c;而且一旦目标应用的界面更新&#xff0c;我们的代码就得跟着改&am…...

Factool:大语言模型事实核查工具包的设计原理与工程实践

1. 项目概述&#xff1a;当AI学会“查证”&#xff0c;我们该如何信任它&#xff1f;最近在折腾大语言模型&#xff08;LLM&#xff09;应用落地的朋友&#xff0c;估计都绕不开一个头疼的问题&#xff1a;幻觉&#xff08;Hallucination&#xff09;。你让模型写一篇行业报告&…...