Search code examples
c++boostboost-multi-array

resizing boost::multi_array to match another


I need to resize one multi_array to the size of another.

In Blitz++ I could just do

arr1.resize(arr2.shape());

Is there a multi_array solution of similar length? Because

arr1.resize(boost::extents[arr2.shape()[0]][arr2.shape()[1]]);

seems a little long and arduous.


Solution

  • You can use the shape() member. Sadly it cannot directly serve as an ExtentList (it doesn't model the Collection concept) but it's easy to make it into one:

    using MA = multi_array<double, 2>;
    MA ma(extents[12][34]);
    auto& ma_shape = reinterpret_cast<boost::array<size_t, MA::dimensionality> const&>(*ma.shape());
    

    So that

    // demo
    std::cout << "[" << ma_shape[0] << "][" << ma_shape[1] << "]\n";
    

    Prints [12][34].

    Now, ma_shape can directly be used to reshape/resize another array:

    Live On Coliru

    #include <boost/multi_array.hpp>
    #include <iostream>
    
    int main() {
        using namespace boost;
        using MA = multi_array<double, 2>;
    
        MA ma(extents[12][34]);
        auto& ma_shape = reinterpret_cast<boost::array<size_t, MA::dimensionality> const&>(*ma.shape());
    
        // demo
        std::cout << "[" << ma_shape[0] << "][" << ma_shape[1] << "]\n";
    
        // resize
        MA other;
        assert(!std::equal(ma_shape.begin(), ma_shape.end(), other.shape()));
    
        other.resize(ma_shape);
        assert(std::equal(ma_shape.begin(), ma_shape.end(), other.shape()));
    
        // reshape
        other.resize(extents[1][12*34]);
        assert(!std::equal(ma_shape.begin(), ma_shape.end(), other.shape()));
    
        other.reshape(ma_shape);
        assert(std::equal(ma_shape.begin(), ma_shape.end(), other.shape()));
    }