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 + -
显示快捷键?