realhappy 发表于 2006-8-29 15:42

请几位版主看看这个程序什么错误

提示错误信息:
??? One or more output arguments not assigned during call to 'reconstitution'.

Error in ==> D:\工具软件\matlab\work\choastoolbox\C_CMethod.m
On line 31==>               X=reconstitution(Y,N_d,m,t);%相空间重构

Y,N_d,m,t都有数值的

eight 发表于 2006-8-29 15:45

这个......直接看错误的提示就知道了:一个或多个输出变量没有被赋值


可能是你的函数返回值不止一个,但是其中有一些在函数返回之前没有被赋值

realhappy 发表于 2006-8-29 20:37

下面是子程序代码,程序本身没有问题,在其他程序里引用过的。
function X=reconstitution(data,N,m,tau)
%该函数用来重构相空间
% m为嵌入空间维数
% tau为时间延迟
% data为输入时间序列
% N为时间序列长度
% X为输出,是m*n维矩阵

M=N-(m-1)*tau;%相空间中点的个数
for j=1:M         %相空间重构
    for i=1:m
      X(i,j)=data((i-1)*tau+j);
    end
end

eight 发表于 2006-8-29 21:09

你的意思是有时候出现错误信息,有时候就没有问题?我怀疑你赋值时并不是把矩阵X的所有元素都赋值,因为返回时出错

[ 本帖最后由 ChaChing 于 2010-6-16 00:22 编辑 ]

jimin 发表于 2006-8-29 21:21

function X=reconstitution(data,N,m,tau)
global X
%该函数用来重构相空间
% m为嵌入空间维数
% tau为时间延迟
% data为输入时间序列
% N为时间序列长度
% X为输出,是m*n维矩阵


M=N-(m-1)*tau;%相空间中点的个数
X=zeros(m,M);
for j=1:M         %相空间重构
    for i=1:m
      X(i,j)=data((i-1)*tau+j);
    end
end
>> global X;
data=;
tau=2;
m=3;
N=8;
X=reconstitution(data,N,m,tau)
----------------------------------------
X =

   1   2   3   4
   3   4   5   6
   5   6   7   8

realhappy 发表于 2006-8-29 21:29

原帖由 eight 于 2006-8-29 21:09 发表



你的意思是有时候出现错误信息,有时候就没有问题?我怀疑你赋值时并不是把矩阵X的所有元素都赋值,因为返回时出错
在C_CMethod程序中调用则出错,在其他程序中调用没有出错,不是有时出错,有时没错。

realhappy 发表于 2006-8-29 21:33

原帖由 jimin 于 2006-8-29 21:21 发表
function X=reconstitution(data,N,m,tau)
global X
%该函数用来重构相空间
...
原来程序单独运行也没有错误。

[ 本帖最后由 ChaChing 于 2010-6-16 00:24 编辑 ]

eight 发表于 2006-8-29 21:35

你再仔细检查一下吧,因为我和5楼的版友都试过在matlab中没有问题,我不知道你的C_CMethod程序是什么东西,我所遇到过的出现这个错误的问题就是之前我说的。

realhappy 发表于 2006-8-29 21:36

请高手们再看看,主程序也贴出来,是用C_C方法求解混沌时间序列的嵌入维和延时。数据是随便的混沌时间序列。

%function =C_CMethod(data)
%this function calculate time delay and embedding demension with C-C
%Method,which proved by H.S.Kim
%skyhawk&flyinghawk
% %****************调试程序段****************************
% clear all;
% data=load('f:/sunpot/year sunpot number.txt');
% %************************************************
load a.mat
data=a(1:50);
N=length(data);
max_d=20;%the maximum value of the time delay

sigma=std(data);%calcute standard deviation s_d

for t=1:max_d
    t
    s_t=0;
    delt_s_s=0;
    for m=2:5
      s_t1=0;
      for j=1:4
            r=sigma*j/2;
            data_d=disjoint(data,N,t);%将时间序列分解成t个不相交的时间序列
            =size(data_d);
            s_t3=0;
            for i=1:t
                i
                Y=data_d(i,:);
                C_1(i)=correlation_integral(Y,N_d,r);%计算C(1,N_d,r,t)
                X=reconstitution(Y,N_d,m,t);%相空间重构
                N_r=N_d-(m-1)*t;
                C_I(i)=correlation_integral(X,N_r,r);%计算C(m,N_r,r,t)
                s_t3=s_t3+(C_I(i)-C_1(i)^m);%对t个不相关的时间序列求和
            end
            s_t2(j)=s_t3/t;
            s_t1=s_t1+s_t2(j);%对rj求和
      end
      delt_s_m(m)=max(s_t2)-min(s_t2);%求delt S(m,t)
      delt_s_s=delt_s_s+delt_s_m(m);%delt S(m,t)对m求和
      s_t0(m)=s_t1;
      s_t=s_t+s_t0(m);%S对m求和
    end
    s(t)=s_t/16;
    delt_s(t)=delt_s_s/4;
    s_cor(t)=delt_s(t)+abs(s(t));
   
end
fid=fopen('result.txt','w');
fprintf(fid,'%f %f %f %f/n',t,s(t),delt_s(t),s_cor(t));
fclose(fid);
t=1:max_d;
plot(t,s,t,delt_s,'.',t,s_cor,'*')

eight 发表于 2006-8-29 21:44

因为没有数据,我只能猜了:我猜想在C_CMethod里面调用reconstitution时,实际参数N和m有错,导致reconstitution中的M和m为小于1的数或Nan,所以不执行循环体,无法返回X。你可以在for循环之前加入测试M和m值的语句,例如 if M > 1 && N > 1 执行循环体,else 输出错误信息。

[ 本帖最后由 ChaChing 于 2010-6-16 00:24 编辑 ]

realhappy 发表于 2006-8-29 21:58

reconstitution中N_d=12,m=4,并没有错误,上传数据,还请大家看看这个蹊跷的错误。
0.97034
0.96275
0.96001
0.96521
0.98063
1.0068
1.0413
1.0788
1.112
1.135
1.1459
1.1464
1.1399
1.1302
1.1203
1.1125
1.1079
1.1072
1.1095
1.1135
1.1165
1.1155
1.1066
1.0866
1.0547
1.0133
0.9671
0.9206
0.87721
0.83895
0.80671
0.78047
0.75944
0.74231
0.72758
0.71391
0.70046
0.68715
0.67477
0.66518
0.66133
0.66715
0.68647
0.72087
0.76807
0.82268
0.87883
0.9323
0.98091
1.024
1.0616
1.0942
1.1222
1.1458
1.1654
1.1812
1.1939
1.2043
1.214
1.2247
1.2383
1.2551
1.2729
1.2862
1.2884
1.2755
1.2472
1.2063
1.1565
1.1014
1.044
0.98619
0.92964
0.87533
0.82383
0.77529
0.72952
0.686
0.64418
0.60381
0.56526
0.52947
0.49781
0.47198
0.45418
0.44733
0.45502
0.48067
0.5256
0.587
0.65806
0.7307
0.79846
0.85746
0.90604
0.94385
0.9713
0.98915
0.99851
1.0007
0.9973
0.99015
0.98141
0.97369
0.97001
0.97356
0.98693
1.011
1.0441
1.0809
1.1144
1.1381
1.1495
1.1498
1.1423
1.1307
1.1181
1.1072
1.0994
1.0955
1.095
1.0967
1.0981
1.0962
1.0872
1.0678
1.0368
0.99643
0.95099
0.90509
0.86221
0.82457
0.79333
0.76867
0.74998
0.73603
0.72526
0.71616
0.70764
0.69934
0.69189
0.687
0.68765
0.69772
0.72077
0.75788
0.80621
0.86017
0.9142
0.96461
1.0098
1.0494
1.0839
1.114
1.1401
1.1626
1.1819
1.1984
1.2123
1.2247
1.2367
1.2498
1.265
1.2817
1.2958
1.3012
1.2926
1.2684
1.2304
1.1824
1.1278
1.0698
1.0106
0.95195
0.89492
0.84027
0.78839
0.73937
0.69302
0.64898
0.60696
0.56705
0.52984
0.49641
0.46817
0.44701
0.4355
0.43699
0.45529
0.49305
0.54945
0.61897
0.69324
0.76448
0.82756
0.88001
0.92119
0.95145
0.97162
0.98283
0.9864

eight 发表于 2006-8-29 22:07

“N_d=12,m=4,并没有错误”是指出错的那次,还是你自己随便测试了某次?

解决办法:在reconstitution函数开始加上 X=[]; 或者 X = zeros(m,M); 试试吧。

ps:你给的函数不能运行的,因为缺少disjoint等这些子函数

[ 本帖最后由 ChaChing 于 2010-6-16 00:25 编辑 ]

realhappy 发表于 2006-8-29 22:13

在reconstitution函数开始加上X = zeros(m,M)后解决了,谢谢eight的热心帮忙,这是什么原因呢?

eight 发表于 2006-8-29 22:22

由于你使用的是循环,所以不断调用reconstitution函数,而你每次调用的时候N和m的值都不一样,如果不在赋值X前清空数组,则matlab工作区中的X其size就是按照第一次执行时生成的大小(原始size),所以,当遇到比X的原始size小的那次循环时,就会出现问题,即提示没有全部赋值(就是我第一次回复你的帖子所说的),比X的原始size大则重新分配空间,因此没有问题。

建议阅读matlab帮助:Preallocating Arrays

[ 本帖最后由 ChaChing 于 2010-6-16 00:26 编辑 ]

jimin 发表于 2006-8-29 22:59

长见识拉
eight,强,人又热心,赞一个!!
页: [1] 2
查看完整版本: 请几位版主看看这个程序什么错误