2016-02-29 3 views
0

Я пытаюсь извлечь подматрицу из multi_array. Для этой демонстрации предположим, что нет свернутых измерений (т. Е. Размерность подматрицы совпадает с размерностью исходного массива). Я думаю, что правильно создаю представление с запрошенными экстентами (хотя и неловко ...), но теперь как мне скопировать данные из запрошенных индексов (как и все индексы представления) в подматрицу? Вот план:Извлечение суб-массива из multi_array

#include <boost/multi_array.hpp> 

const unsigned int Dimension = 3; 
using ArrayType = boost::multi_array<double, Dimension>; 
using IndexType = boost::array<ArrayType::index, Dimension>; 

ArrayType ExtractSubGrid(const ArrayType& array, const typename boost::detail::multi_array::index_gen<Dimension, Dimension>& indices) 
{ 
    typename ArrayType::template const_array_view<Dimension>::type view = array[indices]; 

    IndexType subArraySize; 
    for(size_t dim = 0 ; dim < Dimension; ++dim) { 
     subArraySize[dim] = indices.ranges_[dim].finish_ - indices.ranges_[dim].start_; 
    } 

    ArrayType subArray; 
    subArray.resize(subArraySize); 

    // How to do this? 
    //subArray.data() = view.data(); 

    return subArray; 
} 

int main() 
{ 
    ArrayType myArray(IndexType({{3,4,2}})); 

    boost::detail::multi_array::index_gen<3,3> indices = boost::indices[ArrayType::index_range(0,2)][ArrayType::index_range(1,3)][ArrayType::index_range(0,4)]; 

    ArrayType subGrid = ExtractSubGrid(myArray, indices); 

    return 0; 
} 
+0

Я бы ожидать 'подмассив = вид,' более логически близко к назначению интерфейса. Нет времени проверять вещи, хотя – sehe

+0

@sehe Вау, это компиляция, и это именно то, что я хотел. Теперь просто нужно проверить, что правильные данные поступают для езды. –

ответ

0

Would что-то вроде этой помощи:

std::copy(view.begin(), view.end(), subArray.begin()); 
+0

Было бы хорошо, если мы уверены, что копируем индексы в правильном порядке? Я пытаюсь проверить, заполнив некоторые данные, но загружает множество ошибок с чем-то (казалось бы) простым: «unsigned int i = 0; для (auto itr = myArray.begin(); itr! = MyArray.end(); ++ itr) { * itr = data [i]; i ++; } '? Кажется, он не разыскивает 'itr' изменчивый двойник? –

+0

Было бы это из-за 'const'ess? –

+0

Я попробовал 'ArrayType :: iterator' вместо' auto' в цикле, чтобы убедиться, что он не получает итератор const и он все еще имеет те же ошибки компилятора. Они глубоко внутри subarray.hpp ('запрос для member num_dimensions в 'other', который относится к классу non-class 'const double' и т. Д.). –

Смежные вопросы