利用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不足之处:
未对程序进行封装,不方便以后使用。

猜你喜欢

转载自blog.csdn.net/QBigBangQ/article/details/104829836