[Numpy-discussion] scipy.io.loadmat can't handle structs from octave

Brian Blais bblais at bryant.edu
Mon Jun 12 08:56:51 EDT 2006


Hello,

I am trying to load some .mat files in python, that were saved with octave.  I get
some weird things with strings, and structs fail altogether.  Am I doing something
wrong?  Python 2.4, Scipy '0.4.9.1906', numpy 0.9.8, octave 2.1.71, running Linux.

thanks,

	Brian Blais


here is what I tried:

Numbers are ok:

     ========OCTAVE==========
         >> a=rand(4)
         a =

           0.617860  0.884195  0.032998  0.217922
           0.207970  0.753992  0.333966  0.905661
           0.048432  0.290895  0.353919  0.958442
           0.697213  0.616851  0.426595  0.371364

         >> save -mat-binary pythonfile.mat a
     =========PYTHON===========

         In [13]:d=io.loadmat('pythonfile.mat')

         In [14]:d
         Out[14]:
         {'__header__': 'MATLAB 5.0 MAT-file, written by Octave 2.1.71, 2006-06-09
14:23:54 UTC',
          '__version__': '1.0',
          'a': array([[ 0.61785957,  0.88419484,  0.03299807,  0.21792207],
                [ 0.20796989,  0.75399171,  0.33396634,  0.90566095],
                [ 0.04843219,  0.29089527,  0.35391921,  0.95844178],
                [ 0.69721313,  0.61685075,  0.42659485,  0.37136358]])}


Strings are weird (turns to all 1's)
     ========OCTAVE==========
         >> a='hello'
         a = hello
         >> save -mat-binary pythonfile.mat a
     =========PYTHON===========
         In [15]:d=io.loadmat('pythonfile.mat')

         In [16]:d
         Out[16]:
         {'__header__': 'MATLAB 5.0 MAT-file, written by Octave 2.1.71, 2006-06-09
14:24:13 UTC',
          '__version__': '1.0',
          'a': '11111'}


Cell arrays are fine (except for strings):
     ========OCTAVE==========
         >> a={5 [1,2,3] 'this'}
         a =

         {
           [1,1] = 5
           [1,2] =

             1  2  3

           [1,3] = this
         }

         >> save -mat-binary pythonfile.mat a
     =========PYTHON===========
         In [17]:d=io.loadmat('pythonfile.mat')

         In [18]:d
         Out[18]:
         {'__header__': 'MATLAB 5.0 MAT-file, written by Octave 2.1.71, 2006-06-09
14:24:51 UTC',
          '__version__': '1.0',
          'a': array([5.0, [ 1.  2.  3.], 1111], dtype=object)}




Structs crash:
     ========OCTAVE==========
         >> clear a
         >> a.hello=5
         a =
         {
           hello = 5
         }

         >> a.this=[1,2,3]
         a =
         {
           hello = 5
           this =

             1  2  3

         }

         >> save -mat-binary pythonfile.mat a
     =========PYTHON===========
         In [19]:d=io.loadmat('pythonfile.mat')
         ---------------------------------------------------------------------------
         exceptions.AttributeError                            Traceback (most recent
call last)

         /home/bblais/octave/work/mouse/<console>

         /usr/lib/python2.4/site-packages/scipy/io/mio.py in loadmat(name, dict,
appendmat, basename)
             751     if not (0 in test_vals):       # MATLAB version 5 format
             752         fid.rewind()
         --> 753         thisdict = _loadv5(fid,basename)
             754         if dict is not None:
             755             dict.update(thisdict)

         /usr/lib/python2.4/site-packages/scipy/io/mio.py in _loadv5(fid, basename)
             688         try:
             689             var = var + 1
         --> 690             el, varname = _get_element(fid)
             691             if varname is None:
             692                 varname = '%s_%04d' % (basename,var)

         /usr/lib/python2.4/site-packages/scipy/io/mio.py in _get_element(fid)
             676
             677     # handle miMatrix type
         --> 678     el, name = _parse_mimatrix(fid,numbytes)
             679     return el, name
             680

         /usr/lib/python2.4/site-packages/scipy/io/mio.py in _parse_mimatrix(fid, bytes)
             597                 result[i].__dict__[element] = val
             598         result = squeeze(transpose(reshape(result,tupdims)))
         --> 599         if rank(result)==0: result = result.item()
             600
             601         # object is like a structure with but with a class name

         AttributeError: mat_struct instance has no attribute 'item'


-- 
-----------------

              bblais at bryant.edu
              http://web.bryant.edu/~bblais









More information about the NumPy-Discussion mailing list