function [prr,pcr,p]=glws(x,m,t) %函数名为关联维数的首字母,用于单串序列,多串到glsw; %x为要分析的数据; %x=xlsread('d:\matworks\dbin.xls'); [m1,n1]=size(x); n=m1; [mm1,mm]=size(m); p=zeros(mm,2); %存放拟合系数的矩阵; rr=zeros(20,mm);%rr是相当于筛子的那个距离,存放的是对数; cr=zeros(20,mm);%cr是小于筛子距离的距离个数,存放的是对数; %prr=zeros(20,mm);%rr是相当于筛子的那个距离,存放的是对数; %pcr=zeros(20,mm);%cr是小于筛子距离的距离个数,存放的是对数; scope=zeros(19,1); msr=zeros(19,1); for k=1:mm tt=0; nm=n-(m(k)-1)*t;%Nm为列数; nr=(nm-1)*nm/2;%Nr为距离的总个数; juli=zeros(nr,1);%全部距离搞成一列的长矩阵; r=zeros(nm,nm);%各列之间距离矩阵; y=zeros(m(k),nm);%重构相矩阵的值yij; for j=1:nm for i=1:m(k) y(i,j)=x(j+(i-1)t); end end for i=1:nm-1 for j=i+1:nm for kk=1:m(k) r(i,j)=r(i,j)+(y(kk,j)-y(kk,i))^2; end r(i,j)=sqrt(r(i,j)); tt=tt+1; juli(tt)=r(i,j); end end %进行r和cr个数的计算; rmin=min(juli); rmax=max(juli); for i=1:20 %每次把距离间隔分20分来慢慢加; rr(i,k)=(rmax-rmin)(i+1)/21; %距离取法值得研究一下; for j=1:nr if juli(j)<=rr(i,k) cr(i,k)=cr(i,k)+1; end end rr(i,k)=log(rr(i,k)); cr(i,k)=log(cr(i,k)/nr); end %rr=rr'; tt=0; for i=1:19 scope(i)=(cr(i+1,k)-cr(i,k))/(rr(i+1,k)-rr(i,k));%每点的斜率; tt=tt+scope(i); plot(i,scope(i),'-bd'),hold on; end tt=tt/19;%各相邻点间斜率平均值; tshold=(max(scope)-min(scope))/2;%threshold,阈值; for i=1:19 msr(i)=abs(scope(i)-tt); %各斜率与平均值的均方根,mean square root; end tt=0; for i=2:18 if (msr(i-1)>tshold & msr(i+1)>tshold)|(msr(i-1)<0.001 & msr(i+1)<0.001) continue else tt=tt+1; prr(tt)=rr(i,k);%符合条件的; pcr(tt)=cr(i,k); end end p(k,1:2)=polyfit(prr,pcr,1);%线性拟合,p为两个数,p1为斜率,p2为截距; end 解释一下这段代码
时间: 2023-12-10 20:05:11 浏览: 140
这段代码是用来计算关联维数的,它实现的方法是首先根据输入参数m和t将原始数据x重构为一个相图矩阵,然后计算各列之间的距离,并根据距离分布计算关联维数。
具体实现过程如下:
1. 根据输入参数m和t将原始数据x重构为一个相图矩阵,其中m表示窗口长度,t表示窗口间隔;
2. 计算相图矩阵中各列之间的距离,并将距离存放在juli矩阵中;
3. 根据距离分布统计小于每个距离的距离个数cr,同时记录每个距离rr的大小;
4. 计算cr和rr的对数,然后根据对数统计每个点的斜率scope;
5. 计算斜率的均方根msr和斜率平均值tt,然后根据阈值tshold筛选出符合条件的点;
6. 对符合条件的点进行线性拟合,得到斜率和截距,作为拟合系数p返回。
在代码中使用了一些矩阵操作和数学函数,需要比较熟悉Matlab语言和数学知识才能理解。
相关问题
Compile error: /storage/emulated/0/Android/data/com.cjkj.clanide/files/CJ_IDE/CProject/我的/src/game.c: In function 'play': /storage/emulated/0/Android/data/com.cjkj.clanide/files/CJ_IDE/CProject/我的/src/game.c:31:11: error: declaration of 'prr' as array of functions void(*prr)[4](int , int*, int*) = { up,down,left,right}; ^~~
这个编译错误是因为函数指针数组的声明语法有误。正确的声明语法应该是:
```c
void(*prr[4])(int, int*, int*) = { up, down, left, right };
```
注意,`[4]` 应该放在 `prr` 的后面,表示 `prr` 是一个由 4 个函数指针组成的数组。请将声明语句修改为上述形式,然后重新编译你的代码,应该就能够解决这个错误了。
Compile error: /storage/emulated/0/Android/data/com.cjkj.clanide/files/CJ_IDE/CProject/我的/src/game.c: In function 'play': /storage/emulated/0/Android/data/com.cjkj.clanide/files/CJ_IDE/CProject/我的/src/game.c:31:10: error: declaration of 'prr' as array of functions int(*prr[4])[10](int , int*, int*) = { up,down,left,right}; ^~~
抱歉,我之前的回答有误。这个编译错误是因为你尝试将一个接受 `int (*)[10]` 类型参数的函数指针赋值给一个数组元素,但数组元素的类型是 `int (*)[10]` 类型的指针。
要解决这个问题,你需要将数组元素的类型修改为 `int (*)[10]`,以匹配函数 `up`、`down`、`left`、`right` 的类型。
请尝试将声明修改为以下形式:
```c
int (*prr[4])[10](int, int*, int*) = { up, down, left, right };
```
这样就能够解决编译错误了。
阅读全文