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

You need binmode.

- tye        

  • Comment on Re^3: Write Matlab binary MAT-files from Perl (binmode)

Replies are listed 'Best First'.
Re^4: Write Matlab binary MAT-files from Perl (binmode)
by Anonymous Monk on Jul 25, 2014 at 21:43 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

        For fixed-length formats (like 'd'), a '*' means "consume the remaining arguments". For formats that can have a length (like the ones you are trying to switch to), a '*' means "use the length of the next argument".

        So you need to repeat the variable-length format specifications an appropriate number of times. Like:

        'l5Z*'.('Z*'x@s)

        - tye        

Re^4: Write Matlab binary MAT-files from Perl (binmode)
by Anonymous Monk on Jul 25, 2014 at 21:23 UTC

    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