%by dynamic
%see also http://www.matlabsky.com
%contact me matlabsky@gmail.com
%2009.2.20
我大概看了你下你的两个while循环有可能是死循环,你自己看看
while (j~=0) 这个是永远成立的,因为你的j开始时是3,可是你后面却有一个j=j+1,换句话说这个循环是死循环,除非遇到break语句,但是我没有看见有跳出该循环的break语句
还有while(p<=n) 这个好像也是有问题的,p我没有发现直接的改变方法,只有最后的p=q,恩这个还有可能达到循环结束 但是万一你的那个p=q不执行呢
建议仔细检查这段程序
我回答你的问题啊!呵呵,你怎么不给分啊????实验命令:clcclear allN=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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)