这是一个非常简短的Eigen入门文章。该文章有两层目的。对于想要尽快开始编码的人来说,该文章是对Eigen库的最简单介绍。你可以把该文章作为教程的第一部分,这更加详细的解释了Eigen库。看完这个教程后可以继续阅读 The Matrix class教程。
为了使用Eigen,你仅仅需要下载和解压Eigen的源码(有关下载说明,请参阅wiki )。在Eigen的子目录中有头文件,这是你唯一需要的文件。这些文件在所有平台下都是通用的,无需使用Cmake或者安装什么。
Eigen源码下载链接:https://gitlab.com/libeigen/eigen/-/releases,选择你需要的版本下载。
解压后,将其中的Eigen文件夹放到你的头文件目录,即可在你的工程中使用Eigen。
这是一个非常简单的程序。
// 代码索引 2-1-1-1
#include <iostream>
#include <Eigen/Dense>
using Eigen::MatrixXd;
int main()
{
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
std::cout << m << std::endl;
}
在告诉您如何编译之后,我们将解释该程序。
不需要链接任何库。编译上述程序时唯一需要记住的是编译器必须能够找到Eigen头文件。放置Eigen源代码的路径必须在 include 路径中。使用GCC编译器时,需要用-I选项达到这一目的,因此可以使用如下命令编译程序:
g++ -I /path/to/eigen/ my_program.cpp -o my_program
在linux或者Mac OS X中,你也可以使用符号链接或者复制Eigen文件夹到/usr/local/include/。这样,你就可以使用下列命令来编译程序:
g++ my_program.cpp -o my_program
当你运行该程序时,将产生以下输出:
3 -1
2.5 1.5
// 代码索引 2-1-1-1
#include <iostream>
#include <Eigen/Dense>
using Eigen::MatrixXd;
int main()
{
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
std::cout << m << std::endl;
}
Eigen头文件定义了很多类型,但对于简单的应用程序,仅使用类型MatrixXd可能就足够了。它代表任意大小的矩阵,其中X代表任意大小,d代表元素的类型是double。有关可用于表示矩阵的不同类型的概述,请参阅快速参考指南。
头文件Eigen/Dense定义了关于MatrixXd类型及相关类型的成员函数(另请参阅头文件表)。头文件中定义的所有的类和函数都在Eigen命名空间中。
上述main函数的第一行声明了一个MatrixXd类型的矩阵m,然后指定了该矩阵的大小为2*2,但没有初始化该矩阵。语句m(0,0) = 3代表将该2*2矩阵的左上角元素设置为3。你可以使用圆括号去访问矩阵中对应的元素,如m(0,0)。按照计算机科学中的惯例,第一个元素的索引为 0。
下面的三行代码设置其它三个元素。最后一行代码把矩阵m输送给标准的输出流。
这是另一个例子,它结合了矩阵和向量。包括以下两个版本的程序,输出一样:
版本一:
// 代码索引 2-1-2-1
#include <iostream>
#include <Eigen/Dense>
using Eigen::MatrixXd;
using Eigen::VectorXd;
int main()
{
MatrixXd m = MatrixXd::Random(3,3);
m = (m + MatrixXd::Constant(3,3,1.2)) * 50;
std::cout << "m =" << std::endl << m << std::endl;
VectorXd v(3);
v << 1, 2, 3;
std::cout << "m * v =" << std::endl << m * v << std::endl;
}
版本二:
// 代码索引 2-1-3-1
#include <iostream>
#include <Eigen/Dense>
using Eigen::Matrix3d;
using Eigen::Vector3d;
int main()
{
Matrix3d m = Matrix3d::Random();
m = (m + Matrix3d::Constant(1.2)) * 50;
std::cout << "m =" << std::endl << m << std::endl;
Vector3d v(1,2,3);
std::cout << "m * v =" << std::endl << m * v << std::endl;
}
输出:
m =
94 89.8 43.5
49.4 101 86.8
88.3 29.8 37.8
m * v =
404
512
261
注意,这里的浮点型数字,官网只截取了前面几位,而且做了四舍五入。
版本一首先使用Random()函数初始化了一个3*3的矩阵,其中每一个元素的值都在-1和1之间。下一行使用了一个线性变换,这让所有的值都在10到110之间。函数MatrixXd::Constant(3,3,1.2)返回一个所有元素都是1.2的3*3矩阵。其余部分是标准计算。
main函数的下一行引入了一个新类型VectorXd。它代表一个任意大小的列向量。向量v大小为3并且未初始化。倒数第二行使用了逗号初始化器,解释见高级初始化,此处将向量v初始化为:
v
=
[
1
2
3
]
.
v=\begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix}.
v=
123
.
最后一行让矩阵m和向量v相乘然后输出结果。
现在来解释版本二。
版本一中的MatrixXd表示任意大小的矩阵,版本二中的Matrix3d表示固定大小的矩阵(此处为 3*3)。因为类型已经固定了矩阵的大小,所以没有必要在构造函数中指定大小,只需要对其初始化即可。
同理,VectorXd代表任意大小的列向量,Vector3d代表固定大小的列向量(此处为 3)。同样因为类型已经固定了向量的大小,所以没有必要在构造函数中指定大小,只需要对其初始化即可。
使用固定大小的矩阵和向量有两个优点。编译器会编译出更好(更快)的代码,因为它知道矩阵和向量的大小。在类型中指定大小还允许在编译时进行更严格的检查。例如,如果你尝试将一个 Matrix4d(4*4 矩阵)与 一个 Vector3d(大小为 3 的向量)相乘,编译器会报错。然而,使用太多类型会增加编译时间和可执行文件的大小。矩阵的大小在编译时也可能是未知的。经验法则是对大小为 4*4 或更小的矩阵使用固定大小的类型,其他使用任意大小的类型MatrixXd。
英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
Ruby有一些不错的文档生成器,例如Yard、rDoc,甚至Glyph。问题是Sphinx可以做网站、PDF、epub、LaTex等。它在重组文本中完成所有这些事情。在Ruby世界中有替代方案吗?也许是程序的组合?如果我也能使用Markdown就更好了。 最佳答案 自1.0版以来,Sphinx有了“域”的概念,它是从Python和/或C以外的语言标记代码实体(如方法调用、对象、函数等)的方法。有一个rubydomain,所以你可以只使用Sphinx本身。您唯一会缺少的(我认为)是Sphinx使用autodoc从源代码自动创建文档
我正在开发一个Rails应用程序,我需要在其中找到给定特定偏移量或时区的夏令时开始和结束日期。我基本上在我的数据库中保存了从用户浏览器接收到的时区偏移量(“+3”,“-5”),我想在它出现时修改它由于夏令时的变化。我知道Time实例变量有dst?和isdst方法,如果存储在它们中的日期在夏令时与否。>Time.new.isdst=>true但是使用它来查找夏令时的开始和结束日期会占用太多资源,而且我还必须为我拥有的每个时区偏移量执行此操作。我想知道更好的方法。 最佳答案 好的,基于你所说的和@dhouty'sanswer:您希望能够
我有一台生产机器和一台开发机器,都运行ubuntu8.10并且都运行最新的phusionpassenger。当我在osx上的本地开发机器上使用ruby1.9.1时,我想知道外面的人是否已经在使用带有ruby1.9.1甚至1.9.2的phusionpassenger?如果是这样,请告诉我们您的设置!此外,有没有办法在apache上使用phusionpassenger同时运行ruby1.8.7(ree)和1.9.1?感谢您的指点,我在任何地方都找不到任何提示... 最佳答案 是的,从某些2.2.x版本开始就正式支持它,我不记