将阵列映射回现有的Eigen矩阵
我想将双重数组映射到现有的matrixxd结构.到现在为止 void foo(MatrixXd matrix, int n){ double arrayd = new double[n*n]; // map the input matrix to an array Map(arrayd, n, n) = matrix; //do something with the array ....... // map array back to the existing matrix } 解决方案 我不确定您想要什么,但我会尝试解释. 您将双重混合并漂浮在代码中(矩阵是一个矩阵,每个条目都是浮点).我暂时假设这是无意间的AMD,您想在任何地方使用双倍.请参阅下面的是否真的是您的意图. 指令Map(arrayd, n, n) = matrix将matrix的条目复制到arrayd中.它等效于循
12 2024-04-06
编程技术问答社区
在Eigen::Vector类型中使用Boost累加器
我遇到了一些问题,将Eigen::VectorXd类型与增压器库结合在一起: #include #include #include #include #include using namespace boost::accumulators; using namespace Eigen; int main() { Vector2f a(1.0, 2.0), b(3.0, 10.0); accumulator_set > acc(Vector2f::Zero()); acc(a); acc(b); std::
8 2024-04-02
编程技术问答社区
c++检查模板参数的嵌套类型,以获得其标量基本类型
考虑下面的指数更顺畅的模板类.此类用于呈指数级平滑/过滤顺序数据(请参阅更新方法). elemtype可能是矢量,而floatType通常是标量.例如 ExponentialSmoother x(0.1, Vector2f(0.5, 0.5)); 在此示例中,可以避免第二个模板参数floatType,因为eigen的矩阵类包含一个嵌套的键入以获取标量基本类型: Vector2f::Scalar 同时将elemtype和floatype实例化作为浮子来平滑一维数据也是合理的.在这种情况下,第二个模板也可以跳过. template class ExponentialSmoother { public: // ctor ExponentialSmoother(Floattype alpha, Elemtype& initial_estim
4 2024-04-02
编程技术问答社区
Boost、OpenCV和Eigen库之间的冲突?
我的问题与 static将Boost和OpenCV Libs与Eclipse CDR联系起来.错误,尽管我试图做的比这里所描述的要多:如何创建可以使用boost和opencv中读取文件夹中所有图像的程序?,即使用使用的目录Boost的文件系统库,并使用OpenCV对图像文件进行一些处理. 我用mingw编制了文件系统和其他库,并尝试在Windows 7 64位系统上使用Eclipse CDT运行Boost 1.45,OpenCV 2.2和EIGEN2.如果文件本身在项目中使用,则文件系统库编译和运行,但与其他两个库相结合,我得到以下错误: In file included from C:\boost_1_45_0/boost/filesystem/v3/path_traits.hpp:22:0, from C:\boost_1_45_0/boost/filesystem/v3/path.hpp:25, f
16 2024-04-02
编程技术问答社区
Eigen和boost::serialize
我试图编写一个通用序列化函数,该函数采用任何密集的矩阵并将其序列化: 其他一些有帮助但没有结束的问题在这里: 问题1 12580579/how-to-to-use-boostSerialization to-save-eigenmatrix> Question2 我尝试了以下操作: namespace boost { namespace serialization { template void serialize(Archive & ar, Eigen::EigenBase & g, const unsigned int version) { ar & boost::serialization::make_array(g.derived().data(), g.size()); } }; // namespace serialization
16 2024-04-02
编程技术问答社区
使用Boost::ODEINT与Eigen::Matrix作为状态向量
我正在尝试使用 boost 使用来自Eigen 3 作为我的国家向量的矩阵类,但我遇到了问题深入了解我不明白如何解决. 一个最小的示例是我要做的事情: #include #include #include using namespace Eigen; using namespace boost::numeric::odeint; template using vector = Matrix; typedef vector state; int main() { state X0; X0 stepper;
20 2024-04-02
编程技术问答社区
特征库:在一个函数中以l值的形式返回矩阵块
我试图将矩阵的一个块作为函数的lvalue返回.假设我的功能看起来像: Block getBlock(MatrixXd & m, int i, int j, int row, int column) { return m.block(i,j,row,column); } 事实证明,C ++编译器似乎了解Block()操作员仅给出临时值,因此编译器禁止将其返回为LVALUE.但是,在eigen文档中,有一些示例可以使用eigen作为lvalue(http://eigen.tuxfamily.org/dox/tutorialblockocperations.html#tutorialblockoperations.html.tutorialblockoperations使用)返回. a.block(0,0,2,3) = a.block(2,1,2,3); 谢谢! 解决方案 我想把自己发现的东西放置,所以这可能对别人有帮助: 我的基本
10 2024-04-01
编程技术问答社区
对矩阵乘法性能进行基准测试。C++(eigen)比Python慢得多
我试图估计与C ++相比,Python性能的好处. 这是我的python代码: a=np.random.rand(1000,1000) #type is automaically float64 b=np.random.rand(1000,1000) c=np.empty((1000,1000),dtype='float64') %timeit a.dot(b,out=c) #15.5 ms ± 560 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) ,这是我在发行方式中使用Xcode编辑的C ++代码: #include #include #include using namespace Eigen; using namespace std; int main(int argc, const char * argv[]) {
20 2024-03-30
编程技术问答社区
为什么进行浮点与浮点的矩阵乘法比int与int的乘法快?
具有两个INT矩阵A和B,有超过1000行和10k列,我经常需要将它们转换为浮矩阵以获得加速(4倍或更多). 我想知道为什么是这样?我意识到,随着浮动矩阵乘法的进行,有很多优化和矢量化(例如AVX等).但是,对于整数来说,有一些AVX2的说明(如果我没记错的话).而且,一个人不能为整数使用SSE和AVX吗? 为什么在Matrix代数库(例如Numpy或eigen)下没有启发式启发式,以捕获它并像float一样更快地执行整数矩阵乘法? 关于接受的答案:,而 @sascha的答案非常有用且相关, @chatz的答案是int乘法的int乘法缓慢的实际原因,无论是否存在Blas Integer Matrix操作. 解决方案 如果您编译了这两个简单的功能,这些功能本质上只是计算产品(使用eigen库) #include int mult_int(const Eigen::MatrixXi& A, Eigen::MatrixXi& B) {
22 2024-03-21
编程技术问答社区
如何就地修改一维数组的每个元素?
我有一个双打的1D特征阵列(Eigen::Array),我想修改中的每个元素.但是,我不太确定该怎么做.我正在考虑: Eigen::Array arr1D; // ... // Threshold function: arr1D.unaryExpr([](double& elem) { elem = elem = 0.0替换上述内容,但请注意,这只是一个示例 解决方案 .unaryExpr返回"视图"到由给定函数转换的原始数据.它不会对原始数据进行转换. 您不能将传递给转换功能的参数更改.您的代码仅是因为您没有触发适当代码的模板实例化.如果将结果分配为值,则无法编译: #inclu
12 2024-03-06
编程技术问答社区
将一个特征矩阵映射到一个C数组
我最近开始使用 eigen 库.我有一个将特征矩阵映射到C/C ++数组的问题.默认情况下,主修列矩阵.因此,如果我使用以下代码将矩阵映射到C/C ++数组, double a[10]; double *p = &a[0]; MatrixXd(2,5) m; for (int i=0; i(p,2,5) = m; for (int i=0; i m; 我希望输出看起来像这样: 0 1 2 3 4 1 2
22 2024-03-05
编程技术问答社区
Eigen-Map一个常数组到一个动态矢量
我需要定义一个功能,该函数采用const c数组并将其映射到Eigen映射中.以下代码给了我一个错误: double data[10] = {0.0}; typedef Eigen::Map MapVec; MapVec fun(const double* data) { MapVec vec(data, n); return vec; } 如果我从函数定义中删除const代码正常工作.但是,是否可以保留const而没有任何错误? 谢谢. 解决方案 如果Map的参数是非 - const type(e.Eigen::VectorXd),则假设它可以修改原始缓冲区(在您的情况下*data).正如功能所期望的const合格的缓冲区一样,您必须告诉地图是const.将您的typedef定义为 typedef Eigen::Map MapVec; 它应该起作用.
12 2024-03-05
编程技术问答社区
将特征矩阵转换为C数组
eigen 库可以将现有内存映射到eigen矩阵中. float array[3]; Map(array, 3).fill(10); int data[4] = 1, 2, 3, 4; Matrix2i mat2x2(data); MatrixXi mat2x2 = Map(data); MatrixXi mat2x2 = Map(data, 2, 2); 我的问题是,我们如何从eigen矩阵(例如Matrix3f m)获得C数组(例如float [] a)?特征矩阵的真正布局是什么?实际数据是否像普通C数组一样存储? 解决方案 You can use the data() member function of the特征矩阵类.默认情况下的布局是列 - 列是多维c数组(创建矩阵对象时可以选择布局).对于稀疏矩阵,前面的句子显然不适用. 示例: ArrayXf v = ArrayXf::LinSpa
14 2024-03-04
编程技术问答社区
为ARM交叉编译时未初始化特征向量
我使用ARM-Linux-gnueabihf-G ++(Linaro的GCC版本4.8)在交叉编译程序上使用EIGEN3.目标平台是使用Poky Distribution -ARMV7的Gumstix的Duovero.当我使用特征代码运行程序时,我会在特征对象上获得非常奇怪的值(请参阅本文末尾的输出示例). 我试图关闭矢量化,我已经玩过所有这些标志 -marm -mcpu=cortex-a7 -mfpu=neon -mfloat-abi=hard ,但始终得到相同的行为.如果我在Duovero上编译了相同的代码,则可以正常运行(向量是正确初始化的),但是当我交叉编译时没有.我什至从不同主机进行了交叉编译(Windows7和Ubuntu 14.04). 任何想法为什么会发生这种情况? 这是我的简单程序(从注释中更新) #include using namespace std; #include #incl
12 2024-03-03
编程技术问答社区
在苹果M1上使用clang,出现 "致命错误:'mp.h'文件未找到"
每当我尝试使用OpenMP标志编译时,Clang将无法找到omp.h.这是我想做的 clang++ -dynamiclib -I/opt/homebrew/Cellar/eigen/3.3.9/include/eigen3/ -Xpreprocessor -fopenmp -o libfoo.dylib foolibrary.cpp -lomp 尽管我在/opt/homebrew/Cellar/libomp/11.0.1/include/omp.h中有OMP.H,而Clang在usr/bin/clang中.我需要配置什么,以便能够找到它? 解决方案 当使用酿造对定向M1时,安装的酿造clang是/usr/bin中的不是. brew指令表明它的首选位置是/opt/homebrew./usr/bin中的clang是指向Apple命令行工具ONE的链接;您可以使用-v. 看到 $ /usr/bin/clang -v /usr/bin/clang -v Apple clan
36 2024-03-02
编程技术问答社区
在Android NDK中添加Eigen库
我需要在我的Android Studio项目中包含eigen库来执行一些线性代数操作,并使用我为桌面开发的一些C ++代码.我一直在寻找有关此主题的信息,但是没有太多的信息,我在Android NDK上是新的. eigen库不需要编译,所以我认为这很容易,但是我缺少一些东西.我已经尝试将特征文件夹(所有包含包含)复制到NDK文件夹(.. \ android \ sdk \ ndk-bundle \ sysroot \ usr \ usr \ include),其中还有其他外部库(例如,GLES),但是Android Studio不会检测到它.我该怎么做??预先感谢您,我真的需要这个. 编辑1: 您在这里看到,包括eigen lib,但是当我编译项目时,有很多错误,并且有很多错误,并且我不知道为什么.有什么想法吗? 解决方案 最后,我达到了目标,并且与Android的Eigen合作.如果您要在Android中使用eigen库,我希望这对您有帮助: 从官方网站下载eige
10 2024-02-17
编程技术问答社区
在安卓系统中使用iBeacons进行三坐标测量
我们想使用IBEACON实施某种室内位置确定. 本文似乎真的很有趣,作者在其中实施了非 - 线性最小二乘三角剖分,使用特征C ++库和Levenberg Marquardt算法.由于eigen用C ++编写,因此我尝试使用JNI和Android NDK来使用它,但它会抛出我不知道如何解决的错误,我无法在网上找到任何东西.我也尝试使用Jeigen,但它没有我们需要的所有功能. 所以,我的问题是: 有人使用 Android中的信标? 您认为使用EIGEN+JNI+NDK是一个不错的解决方案吗?如果是, 您是否曾经使用过Levenberg Marquardt实施 组合? 是否有比Levenberg Marquardt算法更好的选项,用于计算Android应用程序中的三材? 解决方案 查看此库:一个> 使用Apache Commons Math的Levenberg-Marquardt算法. 例如.. 进入/a> 您可以看到: double[
12 2024-02-03
编程技术问答社区
在共享内存中使用boost进程间的Eigen固定尺寸矩阵
我喜欢将特征固定尺寸的矩阵放入共享内存中. 但是在执行时,我会收到以下错误: /usr/include/eigen3/Eigen/src/Core/DenseStorage.h:78: Eigen::internal::plain_array::plain_array() [with T = double; int Size = 2; int MatrixOrArrayOptions = 0]: Assertion `(reinterpret_cast(eigen_unaligned_array_assert_workaround_gcc47(array)) & 0xf) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/group__TopicUnaligned
10 2024-01-24
编程技术问答社区
旋转矩阵的特征-正交化
乘以大量旋转矩阵后,由于四舍五入问题(置于正交的) ,最终结果可能不再是有效的旋转矩阵 重新呼吸的一种方法是遵循以下步骤: 将旋转矩阵转换为轴 - 角表示(将轴 - 角向后转换为旋转矩阵( eigen 图书馆是否通过隐藏所有详细信息来做同样的事情?还是有更好的食谱? 由于特殊的奇异案例,必须对此过程进行护理,因此,如果Eigen为此提供了更好的工具. 解决方案 我不使用特征,也没有费力地查找API,但这是一个简单,计算上的便宜且稳定的过程,可以重新倾斜旋转矩阵.该正交化过程来自 让x,y和z是(稍微混乱的)旋转矩阵的行向量.令error=dot(x,y)其中dot()是点产品.如果矩阵是正交的,则x和y的点产物,也就是说,error为零. error平均分布在x和y上:x_ort=x-(error/2)*y和y_ort=y-(error/2)*x.第三行z_ort=cross(x_ort, y_ort),根据定义,x_ort和y_ort. . 现
28 2024-01-22
编程技术问答社区
通过CMake添加一个外部库(如Eigen)。
我已经处理了几个星期.我知道我可能只是错过了我不知道的小步骤.因此,任何见解都将不胜感激. 我正在尝试添加一些外部库,并在我的C ++项目中使用它们.但是似乎无法弄清楚如何.我在互联网上阅读了有关添加外部库的所有帖子,但我相信我缺少一些东西! 假设,我想添加一个简单的库,例如eigen(仅一个标题库).我复制并粘贴包含项目子文件夹中所有文件的文件夹.我称为子文件夹第三型植物. INCLUDE_DIRECTORIES("${MAINFOLDER}/ThirdPartyLibraries/eigen") 我还有其他需要做的吗? 现在,假设我想添加另一个库,例如XGBoost(具有标题和源文件).它会有何不同? 我为XGBoost做了类似的事情.我的代码可能没有任何错误构建,但是只要我不参考库中的任何功能(基本上只是在不使用它的情况下将库添加到我的项目中).当我尝试使用任何功能时,我会发现"未解决的外部符号"的错误,这使我认为我在添加库时缺少某些东西.
14 2023-12-20
编程技术问答社区