coding_mcst.m
来自「曼彻斯特编码的matlab实现。输入概率的条件下会以构架的形式输出编码结果」· M 代码 · 共 86 行
M
86 行
function [Code,Squc,k]=coding_mcst(Prob)
%曼彻斯特编码[Code,Squc,k]=coding_mcst(Prob)
%Prob :输入概率矩阵
%Code :输出编码
%Squc :比较概率次序
%k :编码比较次数
%输入判决
if sum(Prob)~=1
error('check the sum of Probability')
end
%循环条件:首概率和是否等于1
[Prob,id]=sort(Prob);
for i=1:length(Prob)
Code(i).id=i;
Code(i).prob=Prob(i);
Code(i).code=[];
prob(i)=Prob(i);
end
len=length(Prob);
squc=zeros(len,len); %用于存储序号
squc(:,1)=id;
k=0; %计数
while sum(prob(1))~=1
Squc{:,:,k+1}=squc(:,:);
[Code,squc,prob]=SOrt(Code,squc,prob); %
k=k+1;
end
%对编码进行转置
for i=1:len
Code(i).code=fliplr(Code(i).code);
end
%子函数单1:排序函数
function [Code,squc,prob]=SOrt(Code,Squc,Prob)
%Squc :当前排序结果,其dimension一定得符合条件
%Prob :当前排序概率
%squc :排列后的排序
%prob :排列后的概率
%实现的是把概率最小和两个组合,并把它们的概率相加
[prob_sorted,id]=sort(Prob);
prob=[sum(prob_sorted(1:2)),prob_sorted(3:end)];
if length(Prob)>=2
for i=3:length(Prob)*(length(Prob)>2)
squc(i-1,:)=Squc(id(i),:);
squc_sorted(i,:)=Squc(id(i),:);
end
for i=1:2
squc_sorted(i,:)=Squc(id(i),:);
end
% squc_sorted
Code=Add_code(Code,squc_sorted);
s1=Squc(id(1),:);s2=Squc(id(2),:);
s=[s1(s1>0),s2(s2>0)];
len=length(Squc)-length(s);
if len<0
error('排列后的结果超出已有矩阵,需对原矩阵进行扩展')
return
end
squc(1,1:length(s))=sort(s);
else
return
end
%子函数单2:编码函数
function Code=Add_code(Code,squc)
%squc :排序矩阵
%Code :编码结构
%global Code 这种调用方式为什么不行呢?
[m,n]=size(squc);
if n<=2
return
else
for i=1:2
for j=1:sum(squc(i,:)>0)
len=length(Code(squc(i,j)).code);
Code(squc(i,j)).code(len+1)=i-1;
end
end
end
%这里必须要有返回参数,否则无法完成对Code.code的修改
%有一个问题没有解决:关于相同概率的时候的放置问题。
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?