使用Cao法选择维度m,首先需要确定延迟时间tau,具体的延迟时间tau的确定可以看另一篇https://blog.csdn.net/Tonyslp/article/details/122618783?spm=1001.2014.3001.5502
function [m]=Cao(data,tau)
%data为原始数据
%tau为由自相关函数法求出的最佳延迟
%m为由Cao法求出的最佳维度
n=length(data); %n为原始数据的长度
x=reshape(data,n,1); %将原始数据data赋给x,转成列向量
m_max=10; %给定维度最大值为m_max
%构造变量E
E=zeros(1,m_max-2+1); %对应每个维度m,都有一个E
for m=2:1:m_max %给定维度m最大值为m_max
i_max=n-(m-1)*tau; %i_max在m维空间中使用
i_max_h=n-m*tau; %i_max_h在m+1维空间中使用
%构造向量子空间
y=zeros(m,i_max); %y用来存放m维重构向量,共i_max个
y_h=zeros(m+1,i_max_h); %y_h用来存放m+1维重构向量,共i_max_h个
%构造m维空间
for i=1:1:i_max
y(:,i)=x(i:tau:i+(m-1)*tau);
end
%构造m+1维空间
for i=1:1:i_max_h
y_h(:,i)=x(i:tau:i+m*tau);
end
%计算各向量在最大模范数下的最邻近向量
d=inf(1,i_max_h); %d用于存放m维空间中各向量与最邻近向量的最大模范数,赋无限大,方便迭代
d_h=inf(1,i_max_h); %d_h用于存放m+1维空间中各向量与最邻近向量的最大模范数
temp_d=0; %temp_d用于暂存m维空间中最大模范数的值
temp_d_h=0; %temp_d_h用于暂存m+1维空间中最大模范数的值
for i=1:1:i_max_h %计算m维空间中每个向量与最邻近向量的最大模范数
for j=1:1:i_max_h
if j==i %当j=i的时候,跳过本次计算
continue
else
temp_d=norm(y(:,i)-y(:,j),inf); %计算两个向量之间的最大模范数
temp_d_h=norm(y_h(:,i)-y_h(:,j),inf);
if temp_d<=d(1,i)
d(1,i)=temp_d; %迭代找到每个向量与最邻近向量的最大模范数(所有最大模范数中最小的一个)
end
if temp_d_h<=d_h(1,i)
d_h(1,i)=temp_d_h;
end
end
end
end
%构造变量a
a=zeros(1,i_max_h); %a用来存放最大模范数的商
d=d+eps; %加一个小量,避免分母为零
for i=1:1:i_max_h
a(1,i)=d_h(1,i)/d(1,i);
end
E(1,m-1)=sum(a)/(n-m*tau);
end
%构造变量E1
E1=zeros(1,length(E)-1);
for i=1:1:(m_max-2)
E1(i)=E(i+1)/E(i);
end
%根据E1的变换确定维度m,找到E1变化平缓时的m
for i=1:1:length(E1)
if E1(i)>0.9 && E1(i)<1.1
m=i+2; %E中的元素位置对应维度m的大小+1
break
end
end
figure(1);
plot(E);
end