xsj3917 发表于 2006-10-31 12:00

帮我看看我的代码为什么出错

MATLAB代码如下:
%x的二进制表示法,seqb.m文件
function B=seqb(x,b)
k=20;%相当于取i=20
b=0;
for r=1:1:(2^k-1)
    t=r/2^k;
    if x>=t
       theta=(-1)^(r-1);
    else
       theta=0;
    end
    b=b+theta;
end
B=b;

%加密代码
charL='A novel block crytosystem based on iterating a chaotic map é';
doubleL=double();
P=dec2bin(doubleL);
lenP=length(P);

Q=P(1,:);
for i=2:lenP
    Q=;
end
e=64-mod(length(Q),64);
for i=1:e
    Q=;
end
L=length(Q);
L=L/64;
Q=reshape(Q,64,[]);

x=246;
x=x/256*0.6+0.2;

d=250; nu=3.85; b=zeros(1,64); c=zeros(1,6); T=[];
for i=1:L            %迭代d次      
    for i=1:d
      x=nu.*x.*(1-x);
    end
    for i=1:64          %迭代64次,生成A
      x=nu.*x.*(1-x);
      b(1,i)=seqb(x);
    end
    for i=65:70          %迭代6次,生成A'
      x=nu.*x.*(1-x);
      c(1,i-64)=seqb(x);
    end
    d=binvec2dec(c);
    t=;
    t=xor(t,b(:));
    t=num2str(t);
    T=;
end
disp(T);
运行会出现错误提示:??? Index exceeds matrix dimensions.

[ 本帖最后由 xsj3917 于 2006-10-31 15:27 编辑 ]

xsj3917 发表于 2006-10-31 16:01

在一位高手的帮助下找到了出错的原因,是如下循环中重复利用i导致溢出
for i=1:L            %迭代d次      
    for i=1:d
      x=nu.*x.*(1-x);
    end
    for i=1:64          %迭代64次,生成A
      x=nu.*x.*(1-x);
      b(1,i)=seqb(x);
    end
    for i=65:70          %迭代6次,生成A'
      x=nu.*x.*(1-x);
      c(1,i-64)=seqb(x);
    end
    d=binvec2dec(c);
    t=;
    t=xor(t,b();
t=xor(t,b(:));
    t=num2str(t);
    T=;
end
disp(T);
可以将最外层循环的i改为j,相应的t=;中的i也改为j即可
教训:循环嵌套时不要用相同的字母

eight 发表于 2006-10-31 16:19

原帖由 xsj3917 于 2006-10-31 16:01 发表
在一位高手的帮助下找到了出错的原因,是如下循环中重复利用i导致溢出
for i=1:L            %迭代d次      
    for i=1:d
      x=nu.*x.*(1-x);
    end
    for i=1:64          %迭代64次,生成A
   ...


更好的办法是减少使用循环
页: [1]
查看完整版本: 帮我看看我的代码为什么出错