- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用ceres-solver很长一段时间以来,它是一个了不起的工具。到目前为止,我的使用并不是基于可重用代码,我正在努力改进这一点。 Ceres 使用具有特定模板化方法的特定结构作为其 automatic differentiation 的接口(interface).在我试图解决的问题中,继承是有意义的,因为我需要的不同成本函数彼此非常相似。我创建了一个类似的示例(但它没有意义,抱歉)。想象一下,我们希望能够找到具有给定面积的多边形。在我的示例中,多边形可以是三角形或矩形。考虑到这一点,有一个实现所有内容的基类和实现每个特定多边形的面积计算的特定类是有意义的:
形状成本函数
class shapeAreaCostFunction
{
public:
shapeAreaCostFunction(double desired_area): desired_area_(desired_area){}
template<typename T>
bool operator()(const T* shape, T* residual) const{
residual[0] = T(desired_area_) - area(shape);
return true;
}
template<typename T>
virtual T area(const T* shape) const = 0;
protected:
double desired_area_;
};
矩形成本函数
#include "shapeAreaCostFunction.h"
#include "areaLibrary.h"
class rectangleAreaCostFunction : public shapeAreaCostFunction
{
public:
rectangleAreaCostFunction(double desired_area): shapeAreaCostFunction(desired_area){}
template<typename T>
T area(const T* triangle) const
{
return rectangleArea(triangle);
}
};
三角成本函数
#include "shapeAreaCostFunction.h"
#include "areaLibrary.h"
class triangleAreaCostFunction : public shapeAreaCostFunction
{
public:
triangleAreaCostFunction(double desired_area): shapeAreaCostFunction(desired_area){}
template<typename T>
T area(const T* triangle) const
{
return triangleArea(triangle);
}
};
区域库
template<typename T>
T rectangleArea(const T* rectangle)
{
return rectangle[0]*rectangle[1];
}
template<typename T>
T triangleArea(const T* triangle)
{
return rectangleArea(triangle)/T(2);
}
主要
#include <ceres/ceres.h>
#include <iostream>
#include "rectangleAreaCostFunction.h"
#include "triangleAreaCostFunction.h"
#include "areaLibrary.h"
int main(int argc, char** argv){
// Initialize glogging
//google::InitGoogleLogging(argv[0]);
// Get values
/// Get total area
double total_area;
std::cout<<"Enter the desired area: ";
std::cin>>total_area;
/// Get initial rectangle
double rect[2];
std::cout<<"Enter initial rectangle base: ";
std::cin>>rect[0];
std::cout<<"Enter initial rectangle height: ";
std::cin>>rect[1];
/// Get initial triagnle
double tri[2];
std::cout<<"Enter initial triangle base: ";
std::cin>>tri[0];
std::cout<<"Enter initial triangle height: ";
std::cin>>tri[1];
// Copy initial values
double rect_ini[] = {rect[0],rect[1]};
double tri_ini[] = {tri[0],tri[1]};
// Create problem
ceres::Problem problem;
ceres::CostFunction* cost_function_rectangle = new ceres::AutoDiffCostFunction<rectangleAreaCostFunction, 1, 2>(
new rectangleAreaCostFunction(total_area));
ceres::CostFunction* cost_function_triangle = new ceres::AutoDiffCostFunction<triangleAreaCostFunction, 1, 2>(
new triangleAreaCostFunction(total_area));
problem.AddResidualBlock(cost_function_rectangle, NULL, rect);
problem.AddResidualBlock(cost_function_triangle, NULL, tri);
// Solve
ceres::Solver::Options options;
options.linear_solver_type = ceres::DENSE_QR;
options.minimizer_progress_to_stdout = true;
options.max_num_iterations = 10;
ceres::Solver::Summary summary;
ceres::Solve(options, &problem, &summary);
// Compute final areas
double rect_area = rectangleArea(rect);
double tri_area = triangleArea(tri);
// Display results
std::cout << summary.FullReport() << std::endl;
std::cout<<"Rectangle: ("<<rect_ini[0]<<","<<rect_ini[1]<<") -> ("<<rect[0]<<","<<rect[1]<<") total area: "<<rect_area<<"("<< rect_area - total_area<<")"<<std::endl;
std::cout<<"Triangle: ("<<tri_ini[0]<<","<<tri_ini[1]<<") -> ("<<tri[0]<<","<<tri[1]<<") total area: "<<tri_area<<"("<< tri_area - total_area<<")"<<std::endl;
// Exit
return 0;
}
问题是模板化函数不能像 stackoverflow 中多次解释的那样是虚拟的(here 和 here)。但是,似乎有一些workarounds使用 boost::any
.我曾尝试在我的示例中使用它,但没有成功。我还尝试将模板从类方法移动到类,类似于 here , 但 ceres 不接受它作为成本函数。
我的问题是(请记住,我只能使用 template<typename T> bool operator()(...)const
方法,否则我无法与 ceres 交互):
template<typename T> bool operator()(...)const
中调用正确的函数吗?类方法? 提前谢谢你。
最佳答案
我可以想到两种方法。
首先,编写 lambda。二、使用CRTP。
这最好用 c++14 完成.
template<class Area>
auto cost_function(Area area, double desired){
return [=](auto const* shape, auto* residual){
using T=std::decay_t<decltype(*shape)>;
residual[0] = T(desired_area_) - area(shape);
return true;
};
}
auto triangle = [](auto* shape){return triangleArea(shape);};
创建三角形面积成本函数:
auto tri_cost = cost_function(triangle, 3.14159);
并获取类型,decltype(tri_cost)
。
所以:
auto tri_cost = cost_function(triangle, 3.14159);
ceres::CostFunction* cost_function_triangle = new ceres::AutoDiffCostFunction<decltype(tri_cost), 1, 2>(
new decltype(tri_cost)(tri_cost));
您可以在没有 lambda 的情况下执行类似的组合技术,但它更乏味。您还可以将其中一些裸新内容包装在辅助函数中。
template<class D>
class shapeAreaCostFunction {
public:
shapeAreaCostFunction(double desired_area): desired_area_(desired_area){}
template<typename T>
bool operator()(const T* shape, T* residual) const{
residual[0] = T(desired_area_) - static_cast<D const*>(this)->area(shape);
return true;
}
protected:
double desired_area_;
};
像这样修改派生类型:
class triangleAreaCostFunction :
public shapeAreaCostFunction<triangleAreaCostFunction>
{
using base=shapeAreaCostFunction<triangleAreaCostFunction>;
public:
triangleAreaCostFunction(double desired_area): base(desired_area){}
template<typename T>
T area(const T* triangle) const
{
return triangleArea(triangle);
}
};
这被称为使用 CRTP 来实现静态多态性。
关于c++ - Ceres-Solver成本函数继承错误: Templates may not be virtual,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48167705/
打开几个编写宏/代码的示例,我突然被一个似乎安全的代码卡住了。求解器 (SOLVER.XLAM) 这是值得注意的,我想从我的系统中删除它。我想这不是一个相关的代码。谁能告诉我我应该怎么做?我已经安装了
是否可以使用 MSF api 将变量指定为半整数(V = 0 或 a = 5; Q1 = 5; Q2 10 * VPositive<= V <= 20 * VPositive ] ] 如果您使用
我正在研究线性和非线性编程(优化)框架的选项。 要求是: 支持大约线性和非线性规划问题。 100-1000 个变量和最多约 1000 个约束(我认为这很简单)。非线性问题具有涉及多个变量的乘法或除法的
SMT-Solver 可用于约束求解。众所周知,CSP 求解器也用于约束求解多年。那么 SMT 求解器与 CSP 求解器相比有什么优势呢? 最佳答案 这完全取决于你想做什么。您可以将两者都转换为 SA
我正在查看 Caffe LeNet 教程 here我想到了一个问题: 这两个代码有什么区别: self.solver.step(1) 和 self.solver.net.forward() # tr
我正在使用 CBC 求解器在 PyCharm 上解决优化问题,但一直遇到此错误: 错误:求解器 (cbc) 返回非零返回代码 (3221225781) 和 pyutilib.common._excep
我是 microsoft excels 求解器的用户,我很确定不可能求解最大化两个值。我想知道是否有人可能有另一种聪明的方法来做到这一点。 基本上,我有一列介于 1 到 30 之间的数字,我需要查看它
我想从数值的角度理解混合建模(特别是状态事件)背后的一般思想(尽管我不是数学家 :))。鉴于以下 Modelica 模型: model BouncingBall constant Real g
最近,我开始研究形式验证技术。在文献中,模型检查器和求解器可以以某种方式互换使用。 但是,模型检查器和求解器如何相互连接? p.s.如果建议提供一些论文或链接,我将不胜感激。 最佳答案 为了执行模型检
我希望这对某人来说是显而易见的。我只使用过 GLPK/MathProg。 我无法弄清楚 GNU MathProg(在 GLPK 内)中的语法来执行以下操作,例如: set PartsOfWeek; s
我有一个(对我来说)非常复杂的问题。我有两个向量: vectora <- c(111, 245, 379, 516, 671) vectorb <- c(38, 54, 62, 67, 108) 此外
我在 VBA 循环中使用 Excel 2007 中的内置求解器来解决许多不同的问题。有时,求解器会达到最大时间,这会导致出现弹出对话框,询问用户是否要继续、停止或结束。在所有情况下,我都希望它结束
我在 PC 上的 Excel 2010 中创建了一个程序,该程序依赖于 Excel 的内置求解器。我确保它适用于 PC 版 Excel 2010 和 Excel 2013。然后我尝试在 Excel 2
在汽车行业,当您购买汽车时,您有数千种不同的组件可供选择。并非每个组件都是可组合的,因此对于每辆汽车,都存在许多用命题逻辑表达的规则。就我而言,每辆车都有 2000 到 4000 条规则。 它们看起来
有没有办法让我们知道解算器中添加了多少约束?例如,我们初始化一个 z3 求解器 s = Solver(),然后使用 s.add() 添加约束。我们如何获得最终添加到求解器中的约束数量? 最佳答案 您可
我正在尝试修改 ceres 的默认行为,即计算残差的平方和作为成本函数。我希望它只计算总和(残差已经以只能为正的方式计算) 根据文档,我应该使用 ConditionedCostFunction 这是我
我有这个方法来求解根据增量返回 2 种类型数组的二次方程(如果小于零则有复数解) public static final String[] quadEquationSolver(double a, d
p = Int('p') q = Int('q') s = Solver() s.add(1<=p<=9, 1<=q<=19, 5<(3*p-4*q)<10) s.check() print s.mo
“问题”在标题中不应该是问题的情况。 我想为一组问题(类 Problem 的所有子项)实现一个求解器(类 Solver),这些问题或多或少共享同一组方法。我目前的设计是这样的: 在solver.h :
我为所有方向创建了一个单词求解器。它可以水平、垂直和反向查找单词。然而,我在让它走向各个方向时遇到了问题。所以把“你好”放在: H E i l x L p q c L O m 任何人
我是一名优秀的程序员,十分优秀!