2015-08-26 4 views
1

У меня есть трехмерный объект boost::multi_array. Я хотел бы преобразовать абсолютное смещение от origin к многомерному индексу и наоборот. Есть ли простой способ сделать это, используя встроенные средства boost, или мне нужно самому вычислить его с учетом формы и шага массива?boost :: multi_array index to offset offset offset

ответ

0

Конечно, вы можете использовать библиотеку.

Для смещения, вы можете легко использовать указатель arithmetics¹:

size_t offset = &ma[1][2][3] - ma.data(); 
std::cout << "Offset of ma[1][2][3]: " << offset << "\n"; 

документация обнародует более сложный способ получить элемент адрес: link

This expression accesses a specific element of a.index_list is the unique set of indices that address the element returned. It is equivalent to the following code (disregarding intermediate temporaries): 
    // multiply indices by strides 
    std::transform(index_list.begin(), index_list.end(), 
    a.strides(), tmp.begin(), std::multiplies<index>()), 

    // add the sum of the products to the origin 
    *std::accumulate(tmp.begin(), tmp.end(), a.origin()); 

Обратное меньше просто. Я не мог найти прямой путь.

¹ Примечание: используйте std::addressof для защиты от элементов перегружать operator& в родовом коде

+0

Я ожидал что-то вроде '' ind2sub' и sub2ind' функций MATLAB, который спрятаны где-то. Но, похоже, мои ожидания были слишком высокими :) – Alex