求教这个用matlab实现香农费诺编码的程序有什么问题?

求教这个用matlab实现香农费诺编码的程序有什么问题?,第1张

Matlab最讨厌这种嵌套循环加循环了,可以你偏偏要使用,还是用了符号运算,速度当然很令人伤心了

%by dynamic

%see also http://www.matlabsky.com

%contact me [email protected]

%2009.2.20

我大概看了你下你的两个while循环有可能是死循环,你自己看看

while (j~=0) 这个是永远成立的,因为你的j开始时是3,可是你后面却有一个j=j+1,换句话说这个循环是死循环,除非遇到break语句,但是我没有看见有跳出该循环的break语句

还有while(p<=n) 这个好像也是有问题的,p我没有发现直接的改变方法,只有最后的p=q,恩这个还有可能达到循环结束 但是万一你的那个p=q不执行呢

建议仔细检查这段程序

我回答你的问题啊!呵呵,你怎么不给分啊????实验命令:clcclear all

N=input('N=')%输入信源符号的个数

s=0l=0H=0

for i=1:N

fprintf('第%d个',i)

p(i)=input('p=')%输入信源符号概率分布矢量,p(i)<1

if p(i)<=0

error('不符合概率分布')

end

s=s+p(i)

H=H+(- p(i)*log2(p(i)))%计算信源信息熵

end

if (s<=0.999999||s>=1.000001)

error('不符合概率分布')

end

tic

for i=1:N-1 %按概率分布大小对信源排序

for j=i+1:N

if p(i)<p(j)

m=p(j)p(j)=p(i)p(i)=m

end

end

end

x=f1(1,N,p,1)

for i=1:N %计算平均码长

L(i)=length(find(x(i,:)))

l=l+p(i)*L(i)

end

n=H/l%计算编码效率

fprintf('按概率降序排列的码字:\n')

disp(x) %显示按概率降序排列的码字

fprintf('平均码长:\n')

disp(l)% 显示平均码长

fprintf('信源信息熵:\n')

disp(H)%显示信源信息熵

fprintf('编码效率:\n')

disp(n) %显示编码效率

fprintf('计算耗时time= %f\n',toc)

再建立两个M文件:%函数f1存放于f1.m

function x=f1(i,j,p,r)

global x

x=char(x)

if(j<=i)

return

else

q=0

for t=i:j %对于区间[i,j]自上而下求累加概率值

q=p(t)+qy(t)=q

end

for t=i:j%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组

v(t)=abs(y(t)-(q-y(t)))

end

for t=i:j

if(v(t)==min(v)) %求该数组中最小的一个值来确定分界点位置

for k=i:t%赋值码字

x(k,r)='0'

end

for k=(t+1):j

x(k,r)='1'

end

d=t

f1(i,d,p,r+1)%递归调用及相互调用

f2(d+1,j,p,r+1)

f1(d+1,j,p,r+1)

f2(i,d,p,r+1)

else

end

end

end

return第二个:%函数f2存放于f2.m

function x=f2(i,j,p,r)

global x

x=char(x)

if(j<=i)

return

else

q=0

for t=i:j %对于区间[i,j]自上而下求累加概率值

q=p(t)+qy(t-i+1)=q

end

for t=1:j-(i-1)%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组

v(t)=abs(y(t)-(q-y(t)))

end

for t=1:j-(i-1)

if(v(t)==min(v)) %求该数组中最小的一个值来确定分界点位置

d=t+i-1

for k=i:d %赋值码字

x(k,r)='0'

end

for k=(d+1):j

x(k,r)='1'

end

f2(d+1,j,p,r+1)%递归调用及相互调用

f1(i,d,p,r+1)

f2(i,d,p,r+1)

f1(d+1,j,p,r+1)

else

end

end

end

return

建议利用并行计算,速度至少提高1/3,只需要for循环中各次迭代之间无数据传递关系。做法简单:

只需要将你程序中的for更改为parfor即可,但前面需要加入如下指令:

matlabpool open

记得别忘记了程序最后添加:

matlabpool close

具体更改与不更改之间运算速度对比示例如下:

clc

clear

tic

for i=1:1000

c(:,i) = eig(rand(100))

end

display('Single CPU:')

toc

% use PCT

clear

matlabpool open local 2

tic

parfor i=1:1000

c(:,i) = eig(rand(100))

end

display('Double Core:')

toc

matlabpool close


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8161334.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存