Load matlab struct in python

Would you share more details about how the file "lib.mat" is created? I tried following steps:

>>lib.name='hello'

>>Strs(1).id=1

>>Strs(2).id=2

>>Strs(3).id=3

>>lib.Strs = Strs

>>lib.StrList = {1,2,3}

>>save('lib', 'lib')

This what I see in Python:

>>>Obj = eng.load('lib.mat')['lib']

...

ValueError: only a scalar struct can be returned from MATLAB

This is the expected behavior as Struct array is not supported according to the doc:

https://www.mathworks.com/help/matlab/matlab_external/handle-data-returned-from-matlab-to-python.html

In this case, "lib" itself is a scalar struct but the element "Strs" is a struct array.

I have a mat-file that I accessed using

from scipy import io
mat = io.loadmat('example.mat')

From matlab, example.mat contains the following struct

    >> load example.mat
    >> data1

    data1 =

            LAT: [53x1 double]
            LON: [53x1 double]
            TIME: [53x1 double]
            units: {3x1 cell}


    >> data2

    data2 = 

            LAT: [100x1 double]
            LON: [100x1 double]
            TIME: [100x1 double]
            units: {3x1 cell}

In matlab, I can access data as easy as data2.LON, etc.. It's not as trivial in python. It give me several option though like

mat.clear       mat.get         mat.iteritems   mat.keys        mat.setdefault  mat.viewitems   
mat.copy        mat.has_key     mat.iterkeys    mat.pop         mat.update      mat.viewkeys    
mat.fromkeys    mat.items       mat.itervalues  mat.popitem     mat.values      mat.viewvalues    

Is is possible to preserve the same structure in python? If not, how to best access the data? The present python code that I am using is very difficult to work with.

Thanks

asked Aug 14, 2012 at 14:51

mikePmikeP

7812 gold badges10 silver badges19 bronze badges

5

answered Aug 14, 2012 at 15:22

mikePmikeP

7812 gold badges10 silver badges19 bronze badges

1

When I need to load data into Python from MATLAB that is stored in an array of structs {strut_1,struct_2} I extract a list of keys and values from the object that I load with scipy.io.loadmat. I can then assemble these into there own variables, or if needed, repackage them into a dictionary. The use of the exec command may not be appropriate in all cases, but if you are just trying to processes data it works well.

# Load the data into Python     
D= sio.loadmat('data.mat')

# build a list of keys and values for each entry in the structure
vals = D['results'][0,0] #<-- set the array you want to access. 
keys = D['results'][0,0].dtype.descr

# Assemble the keys and values into variables with the same name as that used in MATLAB
for i in range(len(keys)):
    key = keys[i][0]
    val = np.squeeze(vals[key][0][0])  # squeeze is used to covert matlat (1,n) arrays into numpy (1,) arrays. 
    exec(key + '=val')

answered Mar 4, 2018 at 17:47

Load matlab struct in python

Austin DowneyAustin Downey

8732 gold badges10 silver badges24 bronze badges

this will return the mat structure as a dictionary

def _check_keys( dict):
"""
checks if entries in dictionary are mat-objects. If yes
todict is called to change them to nested dictionaries
"""
for key in dict:
    if isinstance(dict[key], sio.matlab.mio5_params.mat_struct):
        dict[key] = _todict(dict[key])
return dict


def _todict(matobj):
    """
    A recursive function which constructs from matobjects nested dictionaries
    """
    dict = {}
    for strg in matobj._fieldnames:
        elem = matobj.__dict__[strg]
        if isinstance(elem, sio.matlab.mio5_params.mat_struct):
            dict[strg] = _todict(elem)
        else:
            dict[strg] = elem
    return dict


def loadmat(filename):
    """
    this function should be called instead of direct scipy.io .loadmat
    as it cures the problem of not properly recovering python dictionaries
    from mat files. It calls the function check keys to cure all entries
    which are still mat-objects
    """
    data = sio.loadmat(filename, struct_as_record=False, squeeze_me=True)
    return _check_keys(data)

answered Dec 8, 2020 at 8:36

idan357idan357

3224 silver badges14 bronze badges

(!) In case of nested structures saved in *.mat files, is necessary to check if the items in the dictionary that io.loadmat outputs are Matlab structures. For example if in Matlab

>> thisStruct

ans =
      var1: [1x1 struct]
      var2: 3.5

>> thisStruct.var1

ans =
      subvar1: [1x100 double]
      subvar2: [32x233 double]

Then use the code by mergen in scipy.io.loadmat nested structures (i.e. dictionaries)

answered Apr 29, 2015 at 20:24

brauliobraulio

4202 silver badges9 bronze badges

How do I load a MATLAB file into Python?

Read Matlab mat Files in Python.
Use the scipy.io Module to Read .mat Files in Python..
Use the NumPy Module to Read mat Files in Python..
Use the mat4py Module to Read mat Files in Python..
Use the matlab.engine Module to Read mat Files in Python..

How do I run a .MAT file in Python?

How to read ..
Install scipy. Similar to how we use the CSV module to work with . ... .
Import the scipy. io. ... .
Parse the . mat file structure. ... .
Use Pandas dataframes to work with the data. Now that you have the information and the data retrieved, how would you work with it?.

How do I load a .MAT file in MATLAB?

To load a subset of variables from a MAT-file on the Home tab, in the Variable section, click Import Data. Select the MAT-file you want to load and click Open. You also can drag the desired variables from the Current Folder browser Details panel of the selected MAT-file to the Workspace browser.

How do I read a .MAT file?

First read the documentation..
Use a hex editor (such as HxD) and look into a reference . mat -file you want to parse..
Try to figure out the meaning of each byte by saving the bytes to a . ... .
Use classes to save each data element (such as miCOMPRESSED , miMATRIX , mxDOUBLE , or miINT32 ).