- 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/
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!