in reply to Re: Write Matlab binary MAT-files from Perl (which byte)
in thread Write Matlab binary MAT-files from Perl

Hi tye,
Thanks!
I have no problem sharing the byte's offset, I have nothing to hide :)
It looks like it's the 9th byte (Byte 8 starting from 0).

It has the value 0x0D and it is apparently an un-needed extra byte located only on the file created in the Perl script and not in the same vector saved directly from matlab.

You can see a screenshot below of the comparisong in BeyondCompare:
(I hope you can see the picture in the link below)

http://srv2.jpg.co.il/2/53d2c3d4335d0.jpg

Do you have any idea how to fix that...?

Thanks,
Koby

  • Comment on Re^2: Write Matlab binary MAT-files from Perl (which byte)

Replies are listed 'Best First'.
Re^3: Write Matlab binary MAT-files from Perl (binmode)
by tye (Sage) on Jul 25, 2014 at 21:11 UTC

      Thanks tye!
      I saw the link, and tried to read it.
      I admit it was quite intimidating at first, but actually quite simple!
      Thank you very much!
      The script works now!
      You've helped me a lot!

      For others who might find this thread and need this MAT saving routine from Perl,
      below you can see the modified function. Works perfectly now (with binmode activated)!

      Thanks,
      Koby

      sub mat4_write { # Variable name. my $name = shift; # Number of rows. my $m = shift; # Number of columns. my $n = shift; # Matrix elements in column major layout, this is the native # Matlab storage layout for matrices. my @a = splice (@_, 0, $m * $n); # File handle. my $h = shift; # use binnary-mode: binmode($h); # Type flag. my $type = $mat4_type; # No imaginary part. my $imag = 0; # Length of variable name including terminating null character. my $len = length ($name) + 1; # Encode and print matrix. print ($h pack ('l5Z*d*', $type, $m, $n, $imag, $len, $name, @a)); }

        Thanks tye for your help!
        One last question, if you may.
        Now that if finally works, I'm trying to save also an array of strings instead of numbers (strings with the same length, as matlab requires) .
        Do you have any idea how should I change the routine above to write matrix with characters (text) in this binary MAT file?

        I guess I should change the pack format string: 'l5Z*d*'.
        From what you wrote at the beginning, I guess I should change the d (A double-precision float in native format) to some of the string/text options...
        I tried several string/text options (a,A,Z,b,h) but none of them worked...
        Some create zeros instead of characters, and some create illegal file that cannot be read by matlab...

        Do you have any idea how should I change the 'pack' format string...?
        Perhaps the format string is not enough...?

        Thanks,
        Koby

      Thanks tye,
      but excuse my ignorence,
      how do I use the binmode...?

      I've attached below the 'mat4_write' code.
      Where should I tell it to use the binmode...?

      Thanks,
      Koby

      sub mat4_write { # Variable name. my $name = shift; # Number of rows. my $m = shift; # Number of columns. my $n = shift; # Matrix elements in column major layout, this is the native # Matlab storage layout for matrices. my @a = splice (@_, 0, $m * $n); # File handle. my $h = shift; # Type flag. my $type = $mat4_type; # No imaginary part. my $imag = 0; # Length of variable name including terminating null character. my $len = length ($name) + 1; # Encode and print matrix. print ($h pack ('l5Z*d*', $type, $m, $n, $imag, $len, $name, @a)); }

        Did you notice that the string "binmode" was underlined and of a different color in my reply above? Did you realize that this is a visual indication that it is a link that you can click on? Did you click on it? Did you read any of the information that then appeared?

        If you have questions related to that information, then I suspect somebody will be happy to answer them. (:

        - tye