相空间重构的赋值方法
非线性研究中,一般都涉及到相空间重构,我现在在做的就是一个嵌入式的重构。具体是这样的:
分析对象是一维时间序列{x1,x2,x3,...,xN},需要将其进行时迟排列建立相空间:
x1 x2 ... xi+1 ... xN-M+1
x2 x3 ... xi+2 ... xN-M+2
X=... ... ... ... ... ...
xM xM+1... xi+M ... xN
其中M是自己选定的,称为窗口长度或者嵌入维数。
由于实验室的机器CPU比较古旧,运算速度实在让人伤心,所以只有在优化程序上面下点工夫,我下面提出两种想法,抛砖引玉,请大家共同讨论。
第一种方法:
完全按照定义:
for i=1:M,xx(i,:)=x(i:(i+N-1)); end
然而众所周知,MATLAB的的弱点恰恰就是循环,能不用还是不用的好。
第二种方法:
x=repmat(x, M, 1); xx=full(spdiags(x, M-N: M+1, N-M+1, M)); xx=rot90(xx, -1);
第二种方法,是应用了MATLAB的矩阵功能,但这里就出现了个问题,就是似乎第二种方法运行起来还不如第一种快,我用MATLAB自带的profiler验证了一下,确实是要慢上很多。
想想也是,我不但先把序列重复了M遍,又赋了个稀疏阵,又做了个旋转……
不过这至少是个想法,不知各位版友有没有更好的想法?
[ 本帖最后由 ChaChing 于 2010-7-5 20:48 编辑 ] 在调用MATLAB自带函数时并非就没有用到循环
自己定义的循环也未必就比用自带函数差呀 谢谢lxq,试验的结果确实说明了这个问题。 看完你写的,我终于搞明白,相空间重构是个什么东东了!谢谢
学习了
你写的进一步加深了我对相空间的理解
页:
[1]