Search code examples
c++matrix

How to reshape a matrix?


I am currently trying to convert some Python code into C++. One 'small' problem is changing the dimensions of a matrix. Is it possible to reshape a matrix in C++ similar to the Python reshape function?

For example, in Python I can easily create an array with numpy and easily reshape the dimensions.

a = np.array([[1,2,3],[4,5,6]])
>>> a.reshape(3,2)
array([[1, 2],
       [3, 4],
       [5, 6]])

How could I do this in C++? Perhaps this is a simple question but I am completely unable to do this. I have seen this within OpenCV library with the Mat class here however it is proving to be insanely difficult to work properly with MinGW, not to mention a very large addition for a single function. It would be ideal if this was possible with 'base' functions.


Solution

  • As far as the memory is laid contiguously (e.g. plain C arrays), you can reinterpret the type with different indices:

    int array[2][3] =   {   { 1, 2, 3 },
                            { 4, 5, 6 } 
                        };
    
    // Reinterpret the array with different indices
    int(*array_pointer)[3][2] = reinterpret_cast<int(*)[3][2]>(array);
    
    for (int x = 0; x < 3; ++x) {
        for (int y = 0; y < 2; ++y)
            std::cout << (*array_pointer)[x][y] << " ";
        std::cout << std::endl;
    }
    // Output:
    // 1 2
    // 3 4
    // 5 6
    

    Example

    The above is just an example to show that the issue really boils down to how memory is laid out in your matrix class.

    In case your class uses a std::vector<int> internally with linear indices, it is sufficient to reinterpret those indices to suit your access patterns.