利用MATLAB嘗試MD碼編碼與壓縮

一、MD編碼

1.1MATLAB代碼:

clc
clear
A=[
     1     1     1     1     2     2     3     3;
     1     1     1     1     2     2     3     3;
     1     1     1     1     4     4     5     5;
     1     1     1     1     4     4     5     5;
     6     6     6     6     7     8    11    11;
     6     6     6     6     9    10    11    11;
     6     6     6     6    12    12    13    13;
     6     6     6     6    12    12    13    13
     ];
 %a=num2str(123)
 %a=num2str(1,'%03d')自定義字符串長度,前補0
 %a=str2num('234')
 %可以通過size(str)查看字符串長度
 %b=dec2bin(a)十進制轉二進制
 %a=bin2dec(b)二進制轉十進制
 %ndims(x)緯度
 %length(x)返回數組中長度最長的一維的長度。
 %size(x)第一維 第二維 第三維……
 %a1='abcd123';b1='decf456';c=[a1,b1]字符串拼接
 %d=strcat(a1,b1) 字符串拼接
 B(8,8)=0;
 %B(1,1)=1;
 for i=1:(size(A))
     for j=1:(size(A))
         a1=dec2bin(i-1);
         a2=dec2bin(j-1);
         b1=num2str(a1);
         b2=num2str(a2);
         if length(b1)>length(b2)
             while length(b1)>length(b2)
                 b2=strcat('0',b2);
             end
         elseif length(b1)<length(b2)
             while length(b1)<length(b2)
                 b1=strcat('0',b1);
             end
         end
         c='';
         for k=1:length(b1)
             c=strcat(b2(length(b1)-k+1),c); 
             c=strcat(b1(length(b1)-k+1),c);
             %c=strcat(b2(k),c);    
         end
         B(i,j)=bin2dec(c);
     end
 end
 C(64,2)=0;
 for i=1:(size(A))
     for j=1:(size(A))
         C(B(i,j)+1,1)=B(i,j);
         C(B(i,j)+1,2)=A(i,j);
     end
 end
 D(64,2)=nan;
 k=1;
 for i=0:3
     j=i*(length(A)/2)^2+1;
     if length(unique(C(j:j+(length(A)/2)^2-1,2)))==1
         D(k,1)=C(j,1);
         D(k,2)=C(j,2);
         k=k+1;
     else
         for l=1:4
             %j=j+l*(length(A)/2^2)^2;
             if length(unique(C(j:j+(length(A)/2^2)^2-1,2)))==1 
                 D(k,1)=C(j,1);
                 D(k,2)=C(j,2);
                 k=k+1;
                 j=j+(length(A)/2^2)^2;
             else
                 for m=1:4
                     D(k,1)=C(j,1);
                     D(k,2)=C(j,2);
                     k=k+1;
                     j=j+1;
                 end
             end
             %j=j+(length(A)/2^2)^2;
         end 
     end
 end
 D=D(1:k-1,:);
 %length(unique())

1.2實現過程:輸入數據: 在這裏插入圖片描述
生成MD碼矩陣:
在這裏插入圖片描述
按照MD碼將數據排列成表格(這裏僅截取部分表格):
在這裏插入圖片描述
對數據進行壓縮:
在這裏插入圖片描述
1.3不足之處:在數據壓縮的步驟中沒有使用遞歸算法,使得程序僅能適用於8×8的矩陣;沒有對程序進行封裝,使得在以後的使用中不夠方便。


更新:

使用遞歸函數進行數據壓縮:

function result=reduce(A)
global E;
if length(unique(A(:,2)))==1
    E=[E;A(1,:)];
    %result=B;
else
    reduce(A(1:length(A)/4,:))
    reduce(A(length(A)/4+1:length(A)/2,:))
    reduce(A(length(A)/2+1:length(A)*3/4,:))
    reduce(A(length(A)*3/4+1:length(A),:))
end
result=E;

主體代碼變爲:

clc
clear
A=[
     1     1     1     1     2     2     3     3;
     1     1     1     1     2     2     3     3;
     1     1     1     1     4     4     5     5;
     1     1     1     1     4     4     5     5;
     6     6     6     6     7     8    11    11;
     6     6     6     6     9    10    11    11;
     6     6     6     6    12    12    13    13;
     6     6     6     6    12    12    13    13
     ];
 %a=num2str(123)
 %a=num2str(1,'%03d')自定義字符串長度,前補0
 %a=str2num('234')
 %可以通過size(str)查看字符串長度
 %b=dec2bin(a)十進制轉二進制
 %a=bin2dec(b)二進制轉十進制
 %ndims(x)緯度
 %length(x)返回數組中長度最長的一維的長度。
 %size(x)第一維 第二維 第三維……
 %a1='abcd123';b1='decf456';c=[a1,b1]字符串拼接
 %d=strcat(a1,b1) 字符串拼接
 B(8,8)=0;
 %B(1,1)=1;
 for i=1:(size(A))
     for j=1:(size(A))
         a1=dec2bin(i-1);
         a2=dec2bin(j-1);
         b1=num2str(a1);
         b2=num2str(a2);
         if length(b1)>length(b2)
             while length(b1)>length(b2)
                 b2=strcat('0',b2);
             end
         elseif length(b1)<length(b2)
             while length(b1)<length(b2)
                 b1=strcat('0',b1);
             end
         end
         c='';
         for k=1:length(b1)
             c=strcat(b2(length(b1)-k+1),c); 
             c=strcat(b1(length(b1)-k+1),c);
             %c=strcat(b2(k),c);    
         end
         B(i,j)=bin2dec(c);
     end
 end
 C(64,2)=0;
 for i=1:(size(A))
     for j=1:(size(A))
         C(B(i,j)+1,1)=B(i,j);
         C(B(i,j)+1,2)=A(i,j);
     end
 end
 %D=[];
 %k=1;
 D=reduce(C);

二、MD解碼

2.1MATLAB代碼:

clc
clear
C=[0,1;16,2;20,3;24,4;28,5;32,6;48,7;49,8;50,9;51,10;52,11;56,12;60,13];
D(64,2)=0;
for i=1:length(C)
    if i<length(C)
        for j=C(i,1):C(i+1,1)-1
            D(j+1,1)=j;
            D(j+1,2)=C(i,2);
        end
    else
        for j=C(i,1):63
            D(j+1,1)=j;
            D(j+1,2)=C(i,2);
        end
    end
end
A(8,8)=0;
B(8,8)=0;
for i=1:(size(A))
     for j=1:(size(A))
         a1=dec2bin(i-1);
         a2=dec2bin(j-1);
         b1=num2str(a1);
         b2=num2str(a2);
         if length(b1)>length(b2)
             while length(b1)>length(b2)
                 b2=strcat('0',b2);
             end
         elseif length(b1)<length(b2)
             while length(b1)<length(b2)
                 b1=strcat('0',b1);
             end
         end
         c='';
         for k=1:length(b1)
             c=strcat(b2(length(b1)-k+1),c); 
             c=strcat(b1(length(b1)-k+1),c);
             %c=strcat(b2(k),c);    
         end
         B(i,j)=bin2dec(c);
     end
 end
for i=1:8
    for j=1:8
        for k=1:64
            if B(i,j)==D(k,1)
                A(i,j)=D(k,2);
            end
        end
    end
end

2.2實現過程:
輸入數據:
在這裏插入圖片描述
對壓縮的數據進行解壓(這裏僅截取部分解壓結果):
在這裏插入圖片描述
生成MD碼矩陣:
在這裏插入圖片描述
由解壓後的表格與生成的MD碼矩陣對照得到解碼後的矩陣:
在這裏插入圖片描述

2.3不足之處:
未對程序進行封裝,不方便以後使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章