声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2810|回复: 7

[经典算法] 如何通过编程判断一维数组的周期?

[复制链接]
发表于 2011-5-11 17:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
      有一组一维数组,数组的长度一定。比如a1=[1 2 3 1 2 3 1 2 3 ... 1 2 3 ],我们就认为a1记录的是一个三周期的运动,a也可能是如下形式a1=[1 1 1 1 ... 1 ],我们认为a1记录的是一个单周期的运动(也可能是一个稳定的吸引子),a1=[14 16 2 9 19 65 32 58 2  ... 81 ],则我们就认为a1记录的吸引子是逆周期的或者是混沌的,假设a1只存在以上几种可能,请问如何通过编程实现对一维数组的操作,使其返回值记录a1是否是周期运动,周期形式是什么(如:是1-2的二周期还是1-2-3的三周期等)。希望大家给一点灵感,要求算法时间越少越好。软件不限,说出大体思路就可以了,谢谢!(这个问题是我在做胞映射---胞化积分轨迹法遇到的)
回复
分享到:

使用道具 举报

发表于 2011-5-11 18:26 | 显示全部楼层
画出曲线图来(横坐标是数组索引,纵坐标是值),既然只存在很明显的几种趋势,观察也能知道了。
 楼主| 发表于 2011-5-12 12:04 | 显示全部楼层
感谢Rainyboy院长的回答,我的想法是做全局形态分析,不能借助观察,完全通过程序和算法实现
发表于 2011-5-12 22:24 | 显示全部楼层
本帖最后由 Rainyboy 于 2011-5-12 22:24 编辑

回复 3 # sososwim 的帖子

这样啊,那做个FFT分析如何?
 楼主| 发表于 2011-5-13 09:32 | 显示全部楼层
本帖最后由 sososwim 于 2011-5-13 11:04 编辑

我在matlab用seqperiod命令可以实现大部分功能,fft去做的思想是怎样?我只知道fft是快速傅里叶变换
发表于 2011-5-14 14:15 | 显示全部楼层
回复 4 # Rainyboy 的帖子

FFT怎么分析呢??
 楼主| 发表于 2011-5-15 16:29 | 显示全部楼层
回复 4 # Rainyboy 的帖子

请问FFT怎么分析呢?
发表于 2011-5-16 15:30 | 显示全部楼层
回复 7 # sososwim 的帖子

我是想通过FFT的结果判断序列数据的周期性……不过对于非简谐数据也不是很明显……还是用常规方法吧……
  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <time.h>
  5. #include <math.h>
  6. using namespace std;
  7. #define NN 10
  8. #define NEARZERO 1e-5

  9. void Sample_Random(double *arrSource,int arrlen)
  10. {
  11. srand((int)time(0));
  12. for(int i=0;i<arrlen;++i)
  13. cout << (*(arrSource+i) = rand()%100)<<endl;
  14. }

  15. void Sample_Cycle(double *arrSouce,int slen,double *arrCycle,int clen)
  16. {
  17. for(int i=0;i<slen;++i)
  18. cout << (*(arrSouce+i) = *(arrCycle+i%clen)) <<endl;
  19. }

  20. int SearchForCycle(double *arrSouce,int slen)
  21. {
  22. for (int clen =1;clen<=slen/2;++clen)
  23. {
  24. double abssum = 0.0;
  25. //按照位移量clen作差并求绝对值和
  26. for(int i=0;i<slen/2;++i)
  27. {
  28. abssum += abs( *(arrSouce+i) - *(arrSouce+i+clen) );
  29. if(abssum >= NEARZERO)
  30. break;
  31. }
  32. if(abssum < NEARZERO)
  33. return clen;
  34. }
  35. return -1;
  36. }

  37. int main(int argc, char* argv[])
  38. {
  39. double arrData[NN];
  40. double arrC3[] = {1,2,3};
  41. double arrC2[] = {1,2};
  42. int choice;
  43. cout<<"0]随机序列"<<"1]循环序列A"<<"2]循环序列B"<<endl;
  44. cin>>choice;
  45. system("cls");
  46. switch (choice)
  47. {
  48. case 0:
  49. Sample_Random(arrData,NN);
  50. break;
  51. case 1:
  52. Sample_Cycle(arrData,NN,arrC2,2);
  53. break;
  54. case 2:
  55. Sample_Cycle(arrData,NN,arrC3,3);
  56. break;
  57. }
  58. cout<<"****"<<endl;
  59. int clen = SearchForCycle(arrData,NN);
  60. if(clen >0)
  61. {
  62. cout<<"最小循环:"<<clen<<endl;
  63. cout<<"循环体:"<<endl;
  64. for(int i=0;i<clen;++i)
  65. {
  66. cout<<arrData[i]<<endl;
  67. }
  68. }
  69. else
  70. {
  71. cout<<"无循环体"<<endl;
  72. }
  73. system("pause");
  74. return 0;
  75. }
复制代码


3.png

2.png


1.png

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-28 12:27 , Processed in 0.064672 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表