def _get_cell(self, varname): # XXX can currently only handle 1D mlabraw.eval(self._session, "TMP_SIZE_INFO__ = \ [min(size(%(vn)s)) == 1 & ndims(%(vn)s) == 2, \ max(size(%(vn)s))];" % {'vn':varname}) is_rank1, cell_len = self._get("TMP_SIZE_INFO__", remove=True).flat if is_rank1: cell_bits = (["TMP%i%s__" % (i, gensym('_')) for i in range(cell_len)]) mlabraw.eval(self._session, '[%s] = deal(%s{:});' % (",".join(cell_bits), varname)) # !!! this recursive call means we have to take care with # overwriting temps!!! return self._get_values(cell_bits) else: raise MlabConversionError("Not a 1D cell array")
def __setstate__(self, state): "Experimental unpickling support." global mlab #XXX this should be dealt with correctly old_name = state['name'] mlab_name = "UNPICKLED%s__" % gensym('') try: tmp_filename = mktemp('.mat') spitOut(state['mlab_contents'], tmp_filename, binary=1) mlab._raw_eval( "TMP_UNPICKLE_STRUCT__ = load('%s', '%s');" % ( tmp_filename, old_name)) mlab._raw_eval( "%s = TMP_UNPICKLE_STRUCT__.%s;" % (mlab_name, old_name)) mlab._raw_eval("clear TMP_UNPICKLE_STRUCT__;") # XXX mlab._make_proxy(mlab_name, constructor=lambda *args: self.__init__(*args) or self) mlab._raw_eval('clear %s;' % mlab_name) finally: if os.path.exists(tmp_filename): os.remove(tmp_filename)