diff m-toolbox/classes/+utils/@helper/dzip.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/+utils/@helper/dzip.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,53 @@
+function Z = dzip(M)
+% DZIP - losslessly compress data into smaller memory space
+%
+% USAGE:
+% Z = dzip(M)
+%
+% VARIABLES:
+% M = variable to compress
+% Z = compressed output
+%
+% NOTES: (1) The input variable M can be a scalar, vector, matrix, or
+%            n-dimensional matrix
+%        (2) The input variable must be a non-complex and full (meaning
+%            matrices declared as type "sparse" are not allowed)
+%        (3) Permitted input types include: double, single, logical,
+%            char, int8, uint8, int16, uint16, int32, uint32, int64,
+%            and uint64.
+%        (4) In testing, DZIP compresses several megabytes of data per
+%            second.
+%        (5) In testing, random matrices of type double compress to about
+%            75% of their original size. Sparsely populated matrices or
+%            matrices with regular structure can compress to less than
+%            1% of their original size. The realized compression ratio
+%            is heavily dependent on the data.
+%        (6) Variables originally occupying very little memory (less than
+%            about half of one kilobyte) are handled correctly, but
+%            the compression requires some overhead and may actually
+%            increase the storage size of such small data sets.
+%            One exception to this rule is noted below.
+%        (7) LOGICAL variables are compressed to a small fraction of
+%            their original sizes.
+%        (8) The DUNZIP function decompresses the output of this function
+%            and restores the original data, including size and class type.
+%        (9) This function uses the public domain ZLIB Deflater algorithm.
+%       (10) Carefully tested, but no warranty; use at your own risk.
+%       (11) Michael Kleder, Nov 2005
+
+s = size(M);
+c = class(M);
+cn = strmatch(c,{'double','single','logical','char','int8','uint8',...
+    'int16','uint16','int32','uint32','int64','uint64'});
+if cn == 3 | cn == 4
+    M=uint8(M);
+end
+M=typecast(M(:),'uint8');
+M=[uint8(cn);uint8(length(s));typecast(s(:),'uint8');M(:)];
+f=java.io.ByteArrayOutputStream();
+g=java.util.zip.DeflaterOutputStream(f);
+g.write(M);
+g.close;
+Z=typecast(f.toByteArray,'uint8');
+f.close;
+return