马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
非线性研究中,一般都涉及到相空间重构,我现在在做的就是一个嵌入式的重构。
具体是这样的:
分析对象是一维时间序列{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 编辑 ] |