基于VS2019的ceres solver配置

news2024/11/15 4:16:54

一、ceres solver介绍

Ceres Solver 是一个开源的C++库,用于建模和解决大型、复杂的优化问题。它可以用来解决有边界约束的非线性最小二乘法问题和一般无约束的优化问题。

官网:http://www.ceres-solver.org/

案例网址:http://www.ceres-solver.org/tutorial.html

二、配置步骤

ceres需要eigen、ceres、gflags、glog、suitesparse三方库,编译过程比较复杂。下面介绍使用VS2019编译好的文件,来配置自己的工程。

2.1下载文件

文件下载链接:

原始工程与Include、Library、SharedDLL的位置为:

2.2配置环境

连接器:

debug下输入的静态文件:ceres-debug.lib glogd.lib

release下输入的静态文件:ceres.lib glog.lib

如果写相对路径,则为:

问题1:

ERROR macro is defined. Define GLOG_NO_ABBREVIATED_SEVERITIES before including logging.h. See the document for detail.

解决方案:

在预处理器中输入:GLOG_NO_ABBREVIATED_SEVERITIES

问题2:

The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _j1. See online help for details.

解决方案:

在预处理器中输入:_CRT_NONSTDC_NO_DEPRECATE

问题3:

“(”:“::”右边的非法标记

解决方案:

在预处理器中输入:NOMINMAX

问题4:

找不到ceres-debug.dll、glog.dll等动态链接

解决方案:

将ShareDLL中ceres-debug.dll、glogd.dll等动态链接文件复制到Debug文件夹下即可

三、测试

优化函数0.5(x-10)^2最小,其使用如下:

// Ceres Solver - A fast non-linear least squares minimizer
// Copyright 2015 Google Inc. All rights reserved.
// http://ceres-solver.org/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
//   this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
//   this list of conditions and the following disclaimer in the documentation
//   and/or other materials provided with the distribution.
// * Neither the name of Google Inc. nor the names of its contributors may be
//   used to endorse or promote products derived from this software without
//   specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Author: keir@google.com (Keir Mierle)
//
// A simple example of using the Ceres minimizer.
//
// Minimize 0.5 (10 - x)^2 using jacobian matrix computed using
// automatic differentiation.

#include "ceres/ceres.h"
#include "glog/logging.h"

using ceres::AutoDiffCostFunction;
using ceres::CostFunction;
using ceres::Problem;
using ceres::Solver;
using ceres::Solve;

// A templated cost functor that implements the residual r = 10 -
// x. The method operator() is templated so that we can then use an
// automatic differentiation wrapper around it to generate its
// derivatives.
struct CostFunctor {
    template <typename T> bool operator()(const T* const x, T* residual) const {
        residual[0] = T(10.0) - x[0];
        return true;
    }
};

int main(int argc, char** argv) {
    google::InitGoogleLogging(argv[0]);

    // The variable to solve for with its initial value. It will be
    // mutated in place by the solver.
    double x = 0.5;
    const double initial_x = x;

    // Build the problem.
    Problem problem;

    // Set up the only cost function (also known as residual). This uses
    // auto-differentiation to obtain the derivative (jacobian).
    CostFunction* cost_function =
        new AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor);
    problem.AddResidualBlock(cost_function, NULL, &x);

    // Run the solver!
    Solver::Options options;
    options.minimizer_progress_to_stdout = true;
    Solver::Summary summary;
    Solve(options, &problem, &summary);

    std::cout << summary.BriefReport() << "\n";
    std::cout << "x : " << initial_x
        << " -> " << x << "\n";
    system("pause");
    return 0;
}

计算结果是:x=10时,最小为5.10*10^-10

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

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

相关文章

【数据结构】各排序方法比较

文章目录一、时间性能二、空间性能三、排序方法的稳定性能四、关于排序方法的时间复杂度的下限一、时间性能 按照平均时间性能来分&#xff0c;有三类排序方法&#xff1a; 时间复杂度为 O(nlogn)的方法有&#xff1a; 快速排序、堆排序、归并排序&#xff0c;其中以快速排序最…

Cesium 常见错误集

解决cesium widgets.css is not exported from package 在版本1.9以上版本后,按照官方文档引入css 时 会报错:cesium widgets.css is not exported from package 解决方案: 1.node_modules里找到cesium的package.json文件,在exports里增加导出widgets.css [rml_read_mo…

华为HCIE学习之open stack开篇(笔记)

文章目录一、云计算和虚拟化的区别二、Openstack的作用三、Openstack部署方式四、Openstack内的一些概念1、租户2、镜像3、规格4、网络一、云计算和虚拟化的区别 云计算是一种服务模式&#xff0c;而虚拟化是一种具体的技术。 二、Openstack的作用 Openstack是一个云操作系统…

小程序开发(五)

上拉触底进行节流处理在data中定义isloading发起请求时完成时回调事件响应式判断自定义编译模式&#xff1a;》编译自动跳转生命周期&#xff1a;onlaunch 初始化完成 只执行一次onShow&#xff1a;切换到前台onHide&#xff1a;切换到后台app.js :onReady :渲染完成才可以修改…

优秀的代码最终选择if else,还是switch case

今天我们不讨论哪个写法读起来更优秀&#xff0c;不讨论对于性能而言哪个更完美&#xff0c;也不讨论哪种情况下对于判断语句是常量还是变量的选择&#xff0c;而是单纯从最简单的角度来看一下&#xff0c;为什么很多优秀的项目优秀的代码&#xff0c;最终选择了if else语句&am…

惠普Probook450G7电脑开机总是卡死蓝屏怎么重装系统?

惠普Probook450G7电脑开机总是卡死蓝屏怎么重装系统&#xff1f;有用户在使用惠普Probook450G7电脑的时候&#xff0c;电脑一开机的时候总是会卡死无法操作&#xff0c;然后就变成蓝屏了。那么遇到这个问题怎么去进行系统的重新安装呢&#xff1f;一起来看看重装系统的具体操作…

中国电子学会2021年06月份青少年软件编程Python等级考试试卷一级真题(含答案)

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 下列程序运行的结果是&#xff1f;&am…

python 环境安装

时隔 将近一年了&#xff0c; 我又重新追寻我的理想了。 趁着2023年刚到&#xff0c;先写一点 python 打个基础。 还是老样子&#xff0c;学到及输出&#xff0c;所以继续写文章。 本文章主要介绍 python 的环境搭建 和 输出 HelloWorld 用于测试搭试好的环境。 本专栏主要…

【ArcGIS微课1000例】0062:标准样式世界地图制作方法

本文基于世界行政区轮廓矢量数据,讲解标准地图的样式(形状)的世界矢量图制作方法。 文章目录 一、加载世界数据二、修改地图投影三、地图布局整饰一、加载世界数据 首先我们将世界行政数据(配套实验数据包中的0062.rar)加载到ArcMap,我们可以看到地图形状接近于矩形形状…

在线 OJ 项目(三) · 处理项目异常 · UUID · 校验代码的安全性 · 阶段性总结

一、处理异常二、区分不同请求的工作目录UUID对 Task 类进行重构三、校验代码的安全性四、阶段性总结书接上回&#xff0c;我们自己测试没问题&#xff0c;是因为使用了正常数据&#xff1b;万一用户输入的是非法的请求&#xff0c;该咋办&#xff1f; 我们需要处理异常请求&a…

内网服务器结合vxlan和iptables-snat实现内网服务器上网——筑梦之路

之前通过其他方式实现 CentOS搭建NAT和DHCP服务&#xff0c;实现共享上网_筑梦之路的博客-CSDN博客_vsphere 创建dhcp CentOS 7 firewalld实现共享上网和搭建本地yum仓库——筑梦之路_筑梦之路的博客-CSDN博客 如上图&#xff0c;有这样一种场景&#xff0c;我们经常遇到&…

【以音视频开发进阶指南为基础】音视频基础概念

一、数字音频 数字音频可以粗糙的理解为将本质是模拟信号的声音音频数字化&#xff0c;那么如何数字化呢&#xff0c;需要经过三个步骤&#xff1a;采样、量化和编码。 采样&#xff1a;将声音的振动信息转化为电信号&#xff0c;再对电信号进行放大处理得到声音的模拟信号&a…

POE交换机常见问题解答

POE交换机通过网线供电的方式为标准的POE终端设备供电&#xff0c;可以免去额外的电源布线&#xff0c;在为一些基于IP的终端&#xff08;如IP电话机、无线局域网接入点AP、网络摄像机等&#xff09;传输数据信号的同时&#xff0c;还能为此类设备提供直流供电的技术。POE技术能…

Windows10安装java环境

Windows10安装java环境 文章目录Windows10安装java环境下载解压配置下载 Java8 https://www.oracle.com/java/technologies/downloads/#java8-windows Java11 https://www.oracle.com/java/technologies/downloads/#java11-windows Java17 https://www.oracle.com/java/techno…

12.日期与时间

目录 一.Date类 1.1 什么是Date类 1.2 Date类的构造器和常用方法 1.2.1 常用构造器 1.2.2 常用方法 二.SimpleDateFormat 2.1 什么是SimpleDateFormat 2.2 SimpleDateFormat的作用 2.3 SimpleDateFormat的构造器和方法 2.3.1 构造器 2.3.2 方法 2.3.3 例子 2.4 Sim…

[论文笔记] XRP: In-Kernel Storage Functions with eBPF

XRP: In-Kernel Storage Functions with eBPF XRP: 利用 eBPF 的核内存储函数 [Paper] [Slides] [Code] OSDI’22 摘要 提出了 XRP, 一个允许应用程序从 NVMe 驱动程序中的 eBPF 钩子(hook)执行用户定义的存储函数(例如索引查找或聚合)的框架, 可以安全地绕过大部分内核的存…

中国电子学会2022年09月份青少年软件编程Python等级考试试卷一级真题(含答案)

分数&#xff1a;100 题数&#xff1a;37 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1.表达式len("学史明理增信 &#xff0c;读史终生受益") > len(" reading history will benefit you ")的结果是&#xff1f;&#xff08;…

vue3全局组件自动注册

前言&#xff1a;本文主要讲述vue3的全局公共组件的自动注册第一步&#xff1a;建文件需要在src/components 下创建一个文件夹用于存放封装的公共组件&#xff08;这里我起名叫coms&#xff09;需要在src/components 下创建一个js文件用于存放引入组件并注册&#xff08;这里我…

前端经典面试500题【下】

面试 一、vue 说说vue动态权限绑定渲染列表&#xff08;权限列表渲染&#xff09; 首先请求服务器,获取当前用户的权限数据,比如请求 this.$http.get(“rights/list”); 获取到权限数据之后,在列表中使用v-if v-if-else的组合来展示不同的内容 <template><div>&…

JavaScript基础复盘3

流程控制 在一个程序执行的过程中&#xff0c;各条代码的执行顺序怼程序的结果是有直接影响的。很多时候我们药通过控制代码的执行顺序来实现我们药完成的功能。 简单理解&#xff1a;流程控制就是来控制我们的代码按照什么结构顺序来执行 JavaScript作为一门程序语言&#x…