Is it a Python matlab.engine's bug for slicing 2D data?

1 view (last 30 days)
The code is as following, when we slicing 2D data img, we've gotten unexpected result. The code is straightforward.
import matlab.engine
import matlab
img = matlab.uint8([[14,18,18,22,24,26,27,31,35,40,42,46,50,51,50,51,43,43,40,35,30,26,24,22,18],[18,19,18,24,26,30,38,43,50,58,62,70,72,78,74,72,66,58,50,43,40,34,26,26,22],[18,22,24,27,34,42,48,60,74,86,104,120,127,130,126,120,104,86,74,62,50,42,38,30,26],[22,26,26,35,46,56,67,91,118,146,174,188,200,209,199,192,167,147,112,88,70,56,43,38,27],[24,30,38,46,59,82,111,151,191,222,245,255,255,255,255,255,244,222,186,142,106,76,58,46,38],[26,34,46,58,82,116,168,221,247,255,255,255,255,255,255,255,255,255,243,202,163,112,78,56,42],[34,42,56,76,120,173,227,255,255,255,255,255,255,255,255,255,255,255,255,255,219,162,111,74,54],[40,50,67,106,170,227,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,221,155,98,66],[46,62,90,142,211,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,202,134,82],[50,70,108,184,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,235,165,102],[56,78,132,214,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,198,122],[59,92,155,233,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,219,142],[66,99,171,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,238,158],[67,106,182,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,243,164],[66,104,180,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,241,170],[66,104,177,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,243,159],[62,94,162,241,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,227,154],[58,86,140,220,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,208,130],[51,74,122,190,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248,179,110],[46,67,98,156,222,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,212,142,88],[42,54,78,126,180,240,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,233,171,112,72],[35,43,63,90,130,186,237,255,255,255,255,255,255,255,255,255,255,255,255,255,233,174,124,78,59],[31,38,50,66,95,142,188,240,255,255,255,255,255,255,255,255,255,255,255,225,174,130,88,62,46],[26,31,42,51,70,92,127,172,210,242,255,255,255,255,255,255,248,234,200,163,120,88,63,51,40],[26,27,31,42,54,64,83,110,146,166,200,209,220,225,218,207,192,163,132,102,78,62,54,42,31]]);
print(img.size) # (25, 25), it is expected.
sub_img = img[0:14][0:14];
print(sub_img.size) # (15, 15) is expected. However, we've gotten (14, 25)

Answers (1)

Lokesh
Lokesh on 23 Apr 2024
Hi,
I understand that the 'sub_img' obtained after slicing 2D data 'img' does not match your expected result.
When attempting to slice a 2D array in Python, and specifically a 2D MATLAB array through Python in this case, the syntax 'img[0:14][0:14]' performs the operation in two steps. Initially, 'img[0:14]' slices the array to include rows 0 through 13, as Python slicing is zero-based and the end index is exclusive. Subsequently, applying [0:14] to the result of 'img[0:14]' slices this intermediate array by rows once again, not columns, resulting in an array of size (14,25).
To correctly slice a 2D array to get a sub-array, you should use a single slicing operation that includes both rows and columns. Here is a sample code:
import matlab.engine
import matlab
# Start MATLAB engine
eng = matlab.engine.start_matlab()
# Create a sample MATLAB array
img = matlab.uint8([[14,18,18,22,24,26,27,...]])
# Assign the MATLAB array to the 'img' variable in the MATLAB workspace
eng.workspace['img'] = img
# Use MATLAB's indexing (which starts at 1) and includes the end index to slice the array
sub_img = eng.eval('img(1:15, 1:15)') # This should give you the 15x15 sub-array
print(sub_img.size) # Should print the size of sub_img, expecting [15, 15]
Hope this helps!

Products


Release

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!