# How to uncompress only the compressed elements in a matrix

I have data in a rectangular structure – something like matrix={{a,b,c},{d,e,f},{g,h,i}}. The problem is that some of the columns consist of uncompressed data and some not. Now I'm looking for an elegant way to uncompress the whole matrix. Unfortunately Uncompress[matrix] doesn't work.

-
Do you know which columns are compressed? –  belisarius Sep 4 '12 at 13:46
Hi! you asked seven questions, but accepted answers for only two of them. Some of the answers you received in the (still) unaccepted questions are very good. I think you should go thru them and accept the better ones. –  belisarius Sep 4 '12 at 14:01
yes I do know, but it can vary from case to case. So a general solution would be more convenient;-) –  RMMA Sep 4 '12 at 14:02
@Verde you are right. Got really perfect answers indeed. Will acept them! –  RMMA Sep 4 '12 at 14:07
Also, are you aware of vote casting? It is very important to enhance the visibility of good questions and answers! –  belisarius Sep 4 '12 at 14:47

Create a matrix, and compress a column

a = RandomInteger[10, {3, 3}]
b = Transpose@{a[[1]], Compress /@ a[[2]], a[[3]]}


Uncompress it:

Quiet@Map[Check[Uncompress[#], #] &, a, {2}]


Edit

Instead of Quiet[] you could use Off[Uncompress::string] so other error messages are not hindered

-
Better to use ReplaceAll with a pattern str_String /; StringMatchQ[str, StartOfString ~~ DigitCharacter ~~ ":" ~~ __] :> Check[Uncompress[str], str, Uncompress::corrupt]? –  Oleksandr R. Sep 4 '12 at 14:02
it seems as if it doesnt work in my case. Maybe because the compressed part can be again a list. In that case I would like to write only the 7th element into the uncompressed matrix. –  RMMA Sep 4 '12 at 14:06
@rainer Why don't you then tell us what your "case" is? Your question is vague and this is the most that can be said without divining your thoughts –  rm -rf Sep 4 '12 at 14:08
@OleksandrR. I am not aware that the : is documented. If it is, you are right –  belisarius Sep 4 '12 at 14:14
ok, now it works. Thx! –  RMMA Sep 4 '12 at 14:42

Here is a way to only uncompress elements that have been compressed. Note that using Mathematica's Compress returns a string starting with <number>:, so we need to Uncompress only those elements that are strings and start with that.

Clear@uncompress
uncompress[s_String] /; StringMatchQ[s, DigitCharacter ~~ ":" ~~ ___] := Uncompress@s
uncompress[x_] := x

-
The characters "1:e" only appear at the beginning for version 1 compression. Version 2 seems to have "2:G". I would tend to consider only the version number and colon to be part of the header proper since I don't know where the "e" or "G" come from... –  Oleksandr R. Sep 4 '12 at 14:08
Is the : documented anywhere? –  belisarius Sep 4 '12 at 14:11
@OleksandrR. There is a version 2 of Compress? I've only ever seen 1:e, but I've changed it to DigitCharacter ~~ ":" since you say you've seen 2:G –  rm -rf Sep 4 '12 at 14:12
@Verde Trying to find it, but not sure if it is –  rm -rf Sep 4 '12 at 14:14
@Verde the fact that Uncompress emits a message when passed something other than a string representing compressed data isn't documented either, but your answer relies on it. By requiring the parameter to be a string of a certain form rather than passing everything indiscriminately, you reduce the chances of encountering side effects or passing some garbage that Uncompress may choke on. Of course the optimum solution is avoid creating data structures that require heuristics to reinterpret in the first place... –  Oleksandr R. Sep 4 '12 at 15:15