[SciPy-User] scipy.io.loadmat error when trying to read a .mat file

Matthew Brett matthew.brett@gmail....
Mon Oct 4 23:41:10 CDT 2010


Hi,

> I see that, if I load the 20100819102442.mat file in matlab and save
> it again, loadmat can read it.   This is in matlab r2008a.

Just a little more on the file 20100819102442.mat

I suspect it must be being written from outside matlab.

The error you are getting is because there is a 1-length string which
has a 0 byte length.  Matlab copes OK with this, and returns a string
' ' - here for the System.Units struct 'Sample' field:

          Pitch: 'deg'
           Roll: 'deg'
        Heading: 'deg'
    Temperature: 'degC'
           Time: ' '
            SNR: 'dB'
         Sample: ' '
        Voltage: 'V'
     Cell_Start: 'm'
      Cell_Size: 'm'
           Step: ' '
          Pings: ' '

scipy and octave barf.  I don't know what scipy used to do in that
situation, but I would be surprised if it hasn't always barfed.   It's
easy to fix that one, but then, once fixed, you get this:

/Users/mb312/usr/local/lib/python2.6/site-packages/scipy/io/matlab/mio5_utils.so
in scipy.io.matlab.mio5_utils.VarReader5.read_struct
(./mio5_utils.c:6836)()

ValueError: two fields with the same name

That turns out to be because the 'Summary' struct has 4 fields all
named 'Station_Q':

              Top_Q: [34x1 double]
           Middle_Q: [34x1 double]
           Bottom_Q: [34x1 double]
             Left_Q: [34x1 double]
            Right_Q: [34x1 double]
            Total_Q: [34x1 double]
              Depth: [34x1 double]
              Cells: [34x1 double]
              Track: [34x2 double]
           Mean_Vel: [34x2 double]
           Boat_Vel: [34x4 double]
          Station_Q: [34x1 double]
          Station_Q: [34x1 double]
          Station_Q: [34x1 double]
          Station_Q: [34x1 double]

Matlab can handle that, although I don't know how you can make a
structure that has two fields with the same name - as far as I know
there's no way to do that with matlab syntax, e.g:

>> a = struct('field1', 1, 'field1', 2)
??? Error using ==> struct
Duplicate field name "field1"

I don't know how to return those guys to you either - structs come
back either as record arrays or objects, and neither allow duplicate
names.  Of course we could rename the duplicates, but that would start
to get a bit tangled.

Is there any way you can load these into matlab and fix them up before
loading into scipy?

I'll commit the changes to allow the 1 length 0 byte strings tomorrow.

Best,

Matthew


More information about the SciPy-User mailing list