一、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不足之處:
未對程序進行封裝,不方便以後使用。