【问题标题】:Subtract max from elements of Boost C++ array从 Boost C++ 数组的元素中减去最大值
【发布时间】:2017-03-07 00:04:55
【问题描述】:

我有一个长度为 x 的 Boost.Numpy 数组 foo,例如foo = [-0.7, -0.9, -0.6]。我想从每个元素中减去最大值,得到foo = [-0.1, -0.3, 0.0]。尝试boost::range::max_element(foo) 我得到error: no matching function for call to 'max_element'。所以我做了以下黑客以获得最大值,

// a bunch of hacky stuff b/c std algorithms don't work well w/ boost arrays
Py_intptr_t const *foo_stride = foo.get_strides();
char const *begin_foo = foo.get_data();
char const *end_foo = foo + foo_stride[0]*x;
double foo_max = *std::max_element(begin_foo, end_foo);

然后我尝试使用 lambda 减去最大值:

std::for_each(begin_foo, end_foo, [](double& d) {d-=foo_max;});

但无济于事:error: no matching function for call to object of type 指向捕获[];尝试[&][=] 也不起作用。所以我现在有一个 for 循环:

for (auto i=0; i<x; ++i) {foo[ii] -= foo_max;}

但这并没有按预期工作。 foo_max 实际上是一个在前面的赋值中被转换为 double 的字符。因此,较早找到最大值的技巧被破坏了。请帮忙。我知道 Boost.Numpy docstutorialsexamples,它们相当差。

【问题讨论】:

  • 今天不是你的日子。:)
  • char const *begin_foo -- 如果你想读取双精度而不是有符号字节,应该将它们转换为double const*....
  • 一些进一步的想法 - 有numpy.amax。 Boost python 让我们import modules,表示为object。我们可以获取属性(函数是模块的属性)并将它们存储在object 实例中,我们可以在这些对象上使用operator() 来调用它们所代表的函数。所以你可以得到一个对象来代表numpy.amax 并用它来获得最大值。 (续...)
  • 感谢@DanMašek 的提示!我尝试了boost::python::object numpy = bpy::import("numpy"); 然后double Y_left_max = numpy.amax(foo);,但这不会构建 b/c error: no member named 'amax' in 'boost::python::api::object'
  • @DanMašek 啊,当然,现在可以了,谢谢。

标签: c++ arrays numpy boost


【解决方案1】:

来自@Dan Mašek的每个cmets:

// Load the numpy.amax module
bpy::object numpy = bpy::import("numpy");
bpy::object numpy_amax = numpy.attr("amax");
auto foo_max = numpy_amax(foo);
for (auto i=0; i<x; ++i) {foo[i] -= foo_max;}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多