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