LZW壓縮(LZW compression)是一種由Abraham Lempel、Jacob Ziv和Terry Welch發明的基于表查尋算法把檔案壓縮成小檔案的無損壓縮方法。具體壓縮原理參考LZW壓縮算法解析,在此不再贅述,參考LZW算法的個人了解與簡單Python實作該文章中的python實作方式寫出來matlab代碼,為學習matlab基本文法用。
compress.m
function array_after_compress = compress( input_array )
% 該函數可以進行LZW壓縮
% 該函數輸入為ab序列,輸出為壓縮後的序列
dict = struct('a',1,'b',2);
prefix = '';
curChar='';
curStr='';
array_after_compress=[];
for curChar = input_array
curStr = [prefix curChar];
if isfield(dict,curStr)
output = -1;
prefix = curStr;
else
output=dict.(prefix);
prefix = curChar;
dict.(curStr)= length(fieldnames(dict))+1;
end
if output~=-1
array_after_compress(end+1)=output;
end
end
output = dict.(prefix);
array_after_compress(end+1)=output;
end
decompress.m
function array_after_decompress = decompress( input_array )
curCodeStr = '';
oldCodeStr='';
array_after_decompress=[];
dicSize = 2;
dict(1).id=1;
dict(1).str='a';
dict(2).id=2;
dict(2).str='b';
for curCode = input_array
[flag, index] = search(dict, curCode);
if flag
curCodeStr = dict(index).str;
else
curCodeStr = [oldCodeStr oldCodeStr(1)];
end
if strcmpi(oldCodeStr,'')~=1
dicSize = dicSize + 1;
dict(dicSize).id = dicSize;
dict(dicSize).str = [oldCodeStr curCodeStr(1)];
end
oldCodeStr = curCodeStr;
array_after_decompress = [array_after_decompress curCodeStr];
end
search.m
function [flag, index] = search( input_array, curCode )
flag = 0;
index = -1;
for element = input_array
if element.id == curCode
flag=1;
index = element.id;
break;
end
end
運作結果如下圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwFMJpnT0smaihmVIVGcwNjYo5kMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DN4YjM1cDN5ATMykDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)