2017-03-07 68 views
1

我有一個長度爲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'。所以,我已經做了下面的技巧來獲取最大價值,從Boost C++數組元素中減去最大值

// 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 (auto i=0; i<x; ++i) {foo[ii] -= foo_max;} 

但如預期,這並不工作。 foo_max實際上是一個字符,它在之前的作業中被加倍。所以更早找到最大值的黑客破解了。請幫忙。我知道Boost.Numpy docstutorialsexamples,而且他們很窮。

+2

這不是你的一天:) –

+0

'字符常量* begin_foo' - 也許應該投那些'雙常量*'如果你想讀的雙打,而不是有符號的字節.... –

+0

一些進一步的想法 - 有['numpy.amax'](https://docs.scipy.org/doc/numpy/reference/generated/numpy.amax.html)。 Boost python讓我們[導入模塊](http://www.boost.org/doc/libs/1_63_0/libs/python/doc/html/reference/embedding/boost_python_import_hpp.html)表示爲'object'。我們可以獲取屬性(函數是模塊的屬性)並將它們存儲在一個'object'實例中,我們可以在這些對象上使用'operator()'來調用它們所代表的函數。所以你可以得到一個對象來表示'numpy.amax'並使用它來獲得最大值。 (續...) –

回答

0

每評論從@Dan Mašek

// 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;}