you don’t have to, it happens ‘in-place’:
const int sz[] = {3,8,8,5}; // slightly smaller for viz.
cv::Mat input_array(4,sz,CV_32F,cv::Scalar(1.0));
std::vector<cv::Range> ranges;
ranges.push_back(cv::Range::all());
ranges.push_back(cv::Range::all());
ranges.push_back(cv::Range::all());
ranges.push_back(cv::Range(0, 2));
cv::Mat subarray = input_array(ranges);
cout << subarray.size << endl;
subarray = subarray * 2; // some op
cout << Mat(8,8,CV_32F,input_array.ptr(0));
3 x 8 x 8 x 2
[2, 2, 1, 1, 1, 2, 2, 1;
1, 1, 2, 2, 1, 1, 1, 2;
2, 1, 1, 1, 2, 2, 1, 1;
1, 2, 2, 1, 1, 1, 2, 2;
1, 1, 1, 2, 2, 1, 1, 1;
2, 2, 1, 1, 1, 2, 2, 1;
1, 1, 2, 2, 1, 1, 1, 2;
2, 1, 1, 1, 2, 2, 1, 1]