不化顽石 发表于 2007-9-6 14:03

相空间重构的赋值方法

非线性研究中,一般都涉及到相空间重构,我现在在做的就是一个嵌入式的重构。
具体是这样的:
分析对象是一维时间序列{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 编辑 ]

lxq 发表于 2007-9-6 14:27

在调用MATLAB自带函数时并非就没有用到循环

自己定义的循环也未必就比用自带函数差呀

不化顽石 发表于 2007-9-6 14:39

谢谢lxq,试验的结果确实说明了这个问题。

xulihua123 发表于 2008-3-17 17:11

看完你写的,我终于搞明白,相空间重构是个什么东东了!谢谢

SMALLTIGER 发表于 2010-7-5 10:34

学习了

你写的进一步加深了我对相空间的理解
页: [1]
查看完整版本: 相空间重构的赋值方法