- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 std::maps 并利用 boost 的 odeint 求解 ODE 系统。默认情况下不支持 std::map 所以我按照 the boost documentation 中的相关步骤进行操作定义自定义 vector 空间代数。
编译时出现如下错误:
In file included from /usr/local/include/boost/numeric/odeint.hpp:32:
In file included from /usr/local/include/boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp:25:
In file included from /usr/local/include/boost/numeric/odeint/stepper/base/explicit_error_stepper_fsal_base.hpp:31:
/usr/local/include/boost/numeric/odeint/util/copy.hpp:43:12: error: no viable overloaded '='
to = from;
...
note: candidate function not viable: 'this' argument has type 'const DeterministicStateType', but method is not marked const
DeterministicStateType& operator=(const DeterministicStateType& a)
我不是 C++ 专家,但这似乎暗示 = 方法需要是 const,这对我来说没有意义。
MWE:
#include <iostream>
#include <map>
#include <boost/numeric/odeint.hpp>
#include <boost/operators.hpp>
namespace pl = std::placeholders;
class DeterministicStateType :
boost::additive1< DeterministicStateType ,
boost::additive2< DeterministicStateType , double ,
boost::multiplicative2< DeterministicStateType , double > > >
{
public:
DeterministicStateType(std::map<std::string, double> map) : mMap(map)
{}
DeterministicStateType() {}
DeterministicStateType(const DeterministicStateType &p)
{
DeterministicStateType(p.mMap);
}
std::map<std::string, double> mMap;
DeterministicStateType& operator+=(const DeterministicStateType &p)
{
for (std::map<std::string, double>::const_iterator it = p.mMap.begin(); it != p.mMap.end(); it++)
{
mMap[it->first] = mMap[it->first] + it->second;
}
return *this;
}
DeterministicStateType& operator+=(double a)
{
for (std::map<std::string, double>::const_iterator it = mMap.begin(); it != mMap.end(); it++)
{
mMap[it->first] += a;
}
return *this;
}
DeterministicStateType& operator*=(const double a)
{
for (std::map<std::string, double>::const_iterator it = mMap.begin(); it != mMap.end(); it++)
{
mMap[it->first] *= it->second;
}
return *this;
}
DeterministicStateType& operator=(const DeterministicStateType& a)
{
mMap.clear();
std::map<std::string, double> map2 = a.mMap;
for (std::map<std::string, double>::iterator it = map2.begin() ; it != map2.end(); it++)
{
mMap[it->first] = it->second;
}
return *this;
}
};
DeterministicStateType operator/( const DeterministicStateType &p1 , const DeterministicStateType &p2 )
{
std::map<std::string, double> map;
std::map<std::string, double> p2map = p2.mMap;
for (std::map<std::string, double>::const_iterator it = p1.mMap.begin() ; it != p1.mMap.end() ; it++)
{
map[it->first] = it->second / p2map[it->first];
}
return DeterministicStateType(map);
}
DeterministicStateType abs( const DeterministicStateType &p )
{
std::map<std::string, double> map;
for (std::map<std::string, double>::const_iterator it = p.mMap.begin() ; it != p.mMap.end() ; it++)
{
map[it->first] = std::abs(it->second);
}
return DeterministicStateType(map);
}
namespace boost { namespace numeric { namespace odeint {
template<>
struct vector_space_norm_inf< DeterministicStateType >
{
typedef double result_type;
double operator()( const DeterministicStateType &p ) const
{
using std::abs;
double max = 0;
for (std::map<std::string, double>::const_iterator it = p.mMap.begin(); it != p.mMap.end(); it++)
{
if (abs(it->second) > max)
{
max = abs(it->second);
}
}
return max;
}
};
}}}
namespace boost { namespace numeric { namespace odeint {
template< >
struct is_resizeable<DeterministicStateType>
{
typedef boost::true_type type;
const static bool value = type::value;
};
template< >
struct same_size_impl<DeterministicStateType, DeterministicStateType>
{
static bool same_size(const DeterministicStateType &v1, const DeterministicStateType &v2)
{
return v1.mMap.size() == v2.mMap.size();
}
};
template< >
struct resize_impl<DeterministicStateType, DeterministicStateType>
{
static void resize(DeterministicStateType &v1, const DeterministicStateType &v2)
{
for (std::map<std::string, double>::const_iterator it = v2.mMap.begin() ; it != v2.mMap.end() ; it++)
{
if (v1.mMap.count(it->first) == 0)
{
v1.mMap[it->first] = 0;
}
}
}
};
}}}
void derivative(const DeterministicStateType p, DeterministicStateType &dpdt, const double t) {}
using namespace boost::numeric::odeint;
int main(int argc, char *argv[])
{
std::map<std::string, double> x0; x0["A"]=1.0; x0["B"]=1.0;
typedef runge_kutta_dopri5<DeterministicStateType, double, DeterministicStateType, double, vector_space_algebra> stepper_type;
integrate_adaptive( make_dense_output(1e-6, 1e-6, stepper_type()) ,
derivative, DeterministicStateType(x0), 0.0, 300.0, 0.00001);
}
最佳答案
复制赋值运算符将 rhs 作为非常量
DeterministicStateType &operator=(DeterministicStateType &a) {
这既不是必需的,也不会在调用代码中的源代码为 const 时编译。只需添加 const 即可修复它:
DeterministicStateType &operator=(DeterministicStateType const& a) {
<罢工>
更好的是,简化所有这些函数(我认为乘法完全错误,它甚至没有使用它的参数):
State &operator=(State const&a) {
mMap = a.mMap;
return *this;
}
更好的是,假设您在编译器上启用了 C++11:
State &operator=(State const&a) = default;
那是因为现在你仍然传递一个临时值给integrate_adaptive
.临时对象仅绑定(bind)到 const&
, 永远不会&
².所以,只需创建你的 DeterministicStateType
在调用之前,并通过引用传递它,而不是临时的 DeterministicStateType(x0)
:
int main() {
DeterministicStateType x0 { { {"A", 1.0}, {"B", 1.0} } };
typedef runge_kutta_dopri5<DeterministicStateType, double, DeterministicStateType, double, vector_space_algebra>
stepper_type;
integrate_adaptive(make_dense_output(1e-6, 1e-6, stepper_type()), derivative, x0, 0.0,
300.0, 0.00001);
}
在这个简化版本中,我使用了一个命名空间,mMap
private 和使用的 C++11 功能使一切都更不容易出错:
#include <boost/numeric/odeint.hpp>
#include <boost/operators.hpp>
#include <iostream>
#include <map>
namespace Deterministic {
class State : boost::additive1<State,
boost::additive2<State, double,
boost::multiplicative2<State, double> > >
{
public:
using Map = std::map<std::string, double>;
State(Map const& map) : mMap(map) {}
State() = default;
State(const State &p) = default;
State &operator=(State const&a) = default;
State &operator+=(const State &p) {
for (auto& p : p.mMap) mMap[p.first] += p.second;
return *this;
}
State &operator+=(double a) {
for (auto& p : mMap)
p.second += a;
return *this;
}
State &operator*=(double f) {
for (auto& p : mMap) mMap[p.first] *= f;
return *this;
}
friend State abs(const State &p) {
using std::abs;
auto map = p.mMap;
for(auto& e : map)
e.second = abs(e.second);
return map;
}
friend State operator/(const State &p1, const State &p2) {
auto map = p1.mMap;
for(auto& e : map)
e.second /= p2.mMap.at(e.first);
return map;
}
friend double vector_space_norm_inf_impl(State const& p) {
double max = 0;
using std::abs;
for (auto& el : p.mMap)
max = std::max(abs(el.second), max);
return max;
}
size_t size() const { return mMap.size(); }
void resize(State const& other) {
for (auto& el : other.mMap)
mMap[el.first] += 0; // inserts if non-existent
}
private:
Map mMap;
};
}
using DeterministicStateType = Deterministic::State;
namespace boost { namespace numeric { namespace odeint {
template <> struct vector_space_norm_inf<DeterministicStateType> {
typedef double result_type;
double operator()(const DeterministicStateType &p) const { return vector_space_norm_inf_impl(p); }
};
template <> struct is_resizeable<DeterministicStateType> {
typedef boost::true_type type;
const static bool value = type::value;
};
template <> struct same_size_impl<DeterministicStateType, DeterministicStateType> {
static bool same_size(const DeterministicStateType &v1, const DeterministicStateType &v2) {
return v1.size() == v2.size();
}
};
template <> struct resize_impl<DeterministicStateType, DeterministicStateType> {
static void resize(DeterministicStateType &v1, const DeterministicStateType &v2) {
v1.resize(v2);
}
};
} } }
void derivative(const DeterministicStateType, DeterministicStateType &, const double) {}
using namespace boost::numeric::odeint;
int main() {
DeterministicStateType x0 { { {"A", 1.0}, {"B", 1.0} } };
typedef runge_kutta_dopri5<DeterministicStateType, double, DeterministicStateType, double, vector_space_algebra>
stepper_type;
integrate_adaptive(make_dense_output(1e-6, 1e-6, stepper_type()), derivative, x0, 0.0,
300.0, 0.00001);
}
² 除了损坏的编译器
关于c++ - 将 boost odeint 与 std::map 和自定义 vector 空间代数一起使用时,没有可行的重载 '=',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46922273/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!