module NMatrix::IO::Matlab
Reader (and eventually writer) of Matlab .mat files.
The .mat file format is documented in the following link:
Public Class Methods
complex_merge(p1, p2, p3)
click to toggle source
Take two byte-strings (real and imaginary) and treat them as if they contain a sequence of data of type dtype. Merge them together and return a new string.
static VALUE nm_rbstring_merge(VALUE self, VALUE rb_real, VALUE rb_imaginary, VALUE rb_dtype) { // Sanity check. if (RSTRING_LEN(rb_real) != RSTRING_LEN(rb_imaginary)) { rb_raise(rb_eArgError, "real and imaginary components do not have same length"); } nm::dtype_t dtype = nm_dtype_from_rbsymbol(rb_dtype); size_t len = DTYPE_SIZES[dtype]; char *real = RSTRING_PTR(rb_real), *imag = RSTRING_PTR(rb_imaginary); char* merge = NM_ALLOCA_N(char, RSTRING_LEN(rb_real)*2); size_t merge_pos = 0; // Merge the two sequences for (size_t i = 0; i < (size_t)RSTRING_LEN(rb_real); i += len) { // Copy real number memcpy(merge + merge_pos, real + i, len); merge_pos += len; // Copy imaginary number memcpy(merge + merge_pos, imag + i, len); merge_pos += len; } return rb_str_new(merge, merge_pos); }
load(mat_file_path) → NMatrix
click to toggle source
load_mat(mat_file_path) → NMatrix
Load a .mat file and return a NMatrix corresponding to it.
# File lib/nmatrix/nmatrix.rb, line 72 def load_mat(file_path) NMatrix::IO::Matlab::Mat5Reader.new(File.open(file_path, "rb+")).to_ruby end
Also aliased as: load
repack(p1, p2, p3)
click to toggle source
Take a string of bytes which represent MATLAB data type values and repack them into a string of bytes representing values of an NMatrix dtype (or itype).
Returns what appears to be a Ruby String.
Arguments:
- str
-
the data
- from
-
symbol representing MATLAB data type (e.g., :miINT8)
- type
-
either :itype or some dtype symbol (:byte, :uint32, etc)
static VALUE nm_rbstring_matlab_repack(VALUE self, VALUE str, VALUE from, VALUE type) { nm::io::matlab_dtype_t from_type = matlab_dtype_from_rbsymbol(from); uint8_t to_type; if (SYMBOL_P(type)) { if (rb_to_id(type) == rb_intern("itype")) { if (sizeof(size_t) == sizeof(int64_t)) { to_type = static_cast<int8_t>(nm::INT64); } else if (sizeof(size_t) == sizeof(int32_t)) { to_type = static_cast<int8_t>(nm::INT32); } else if (sizeof(size_t) == sizeof(int16_t)) { to_type = static_cast<int8_t>(nm::INT16); } else { rb_raise(rb_eStandardError, "unhandled size_t definition"); } } else { to_type = static_cast<uint8_t>(nm_dtype_from_rbsymbol(type)); } } else { rb_raise(rb_eArgError, "expected symbol for third argument"); } // For next few lines, see explanation above NM_MATLAB_DTYPE_TEMPLATE_TABLE definition in io.h. if (to_type >= static_cast<uint8_t>(nm::COMPLEX64)) { rb_raise(rb_eArgError, "can only repack into a simple dtype, no complex/VALUE"); } // Do the actual repacking -- really simple! NM_MATLAB_DTYPE_TEMPLATE_TABLE(ttable, nm::io::matlab_cstring_to_dtype_string, char*, size_t& result_len, const char* str, size_t bytes); size_t repacked_data_length; char* repacked_data = ttable[to_type][from_type](repacked_data_length, RSTRING_PTR(str), RSTRING_LEN(str)); // Encode as 8-bit ASCII with a length -- don't want to hiccup on \0 VALUE result = rb_str_new(repacked_data, repacked_data_length); NM_FREE(repacked_data); // Don't forget to free what we allocated! return result; }