⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xiangnong.m

📁 香农—费诺编码的MATLAB实现
💻 M
字号:
clc;
clear;
A=[0.4,0.3,0.1,0.09,0.07,0.04];
A=fliplr(sort(A));%降序排列
[m,n]=size(A);
for i=1:n
    B(i,1)=A(i);%生成B的第1列
end
%生成B第2列的元素
a=sum(B(:,1))/2;
for k=1:n-1
    if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a)
        break;
    end
end
for i=1:n%生成B第2列的元素
    if i<=k
        B(i,2)=0;
    else
        B(i,2)=1;
    end
end
%生成第一次编码的结果
END=B(:,2)';
END=sym(END);
%生成第3列及以后几列的各元素
j=3;
while (j~=0)
    p=1;
    while(p<=n)
        x=B(p,j-1);
        for q=p:n
            if x==-1
                break;
            else
                if B(q,j-1)==x
                    y=1;
                    continue;
                else
                    y=0;
                    break;
                end
            end
        end
       if y==1
            q=q+1;
       end
       if q==p|q-p==1
            B(p,j)=-1;
       else
            if q-p==2
                B(p,j)=0;
                END(p)=[char(END(p)),'0'];
                B(q-1,j)=1;
                END(q-1)=[char(END(q-1)),'1'];
            else
                a=sum(B(p:q-1,1))/2;
                for k=p:q-2
                    if abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1,1))-a);
                            break;
                    end
                end
                    for i=p:q-1
                        if i<=k
                            B(i,j)=0;
                            END(i)=[char(END(i)),'0'];
                        else
                            B(i,j)=1;
                            END(i)=[char(END(i)),'1'];
                        end
                    end
            end
        end
         p=q;
    end 
    C=B(:,j);
    D=find(C==-1);
    [e,f]=size(D);
    if e==n
        j=0;
    else
        j=j+1;
    end
end
B
A
END
for i=1:n
    [u,v]=size(char(END(i)));
    L(i)=v;
end
avlen=sum(L.*A)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -