天天看點

matlab實作LZW壓縮

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
           

運作結果如下圖所示:

matlab實作LZW壓縮

繼續閱讀