class GetCycle
{
public int getCycle(float[] data)
{
int indexMin = 0;
int indexMax = 0;
List<int> cycleList = new List<int>();
int[] cycleGather = null;
int cycle = 0;
var max = data[0];
var min = data[0];
//计算每100个数的周期
for (int j = 0; j < data.Length - 100; j++)
{
for (int i = j; i < j + 100; i++)
{
if (max < data[i])
{
int temp = 0;
max = data[i];
temp = i;
if (indexMax < temp)
{
indexMax = temp;
}
}
if (min > data[i])
{
int temp = 0;
min = data[i];
temp = i;
if (indexMin < temp)
{
indexMin = temp;
}
}
cycleList.Add(Math.Abs(indexMax - indexMin) * 2);
}
}
cycleGather = cycleList.ToArray();
//找出周期集合中重复次数最多的数值
var res = from n in cycleGather
group n by n into g
orderby g.Count() descending
select g;
var gr = res.First();
foreach (var x in gr)
{
cycle = x;
}
return cycle;
}
}
我想每个小周期求一次下标差,但是按我写的代码求出来的结果是整个数组的最大最小值的下标差
不能都初始化为0,下标应该初始化为当前批次的开始下标,最大值和最小值应该初始化为数组中可能出现的最小值和最大值(注意反过来)
改下面这样。
而且
cycleList.Add(Math.Abs(indexMax - indexMin) * 2);
这句应该放到i循环外层,放内层没必要,每次i循环都加一个数到列表中
//计算每100个数的周期
for (int j = 0; j < data.Length - grpNum; j++)
{
max = -9999;//初始为这个值也不一定对,应该初始化为data数组中可能出现的最小值,要不都小于于这个的值下面的if判断就没搞了
min =99999;//初始为这个值也不一定对,应该初始化为data数组中可能出现的最大值,要不都是大于这个的值下面的if判断就没搞了
indexMin = indexMax = j;//这里应该初始化为批次的第一个下标,而不是0,要不max,min比较不通过那么可能为0
for (int i = j; i < j + grpNum; i++)
{
if (max < data[i])
{
int temp = 0;
max = data[i];
temp = i;
if (indexMax < temp)
{
indexMax = temp;
}
}
if (min > data[i])
{
int temp = 0;
min = data[i];
temp = i;
if (indexMin < temp)
{
indexMin = temp;
}
}
}
cycleList.Add(Math.Abs(indexMax - indexMin) * 2);////////////每组计算一次,不用放i循环中
}
//计算每100个数的周期
for (int j = 0; j < data.Length - 100; j++)
外层循环不对吧,怎么是减去100呢? 既然每100个一组,那么j应该小于实际分成多少个组
int n = data.Length / 100;
if(data.Length%100 > 0) n++;
for(int j=0;j<n;j++)
定义一个 int temp = 0;干啥啊,完全没有用啊,temp改成i就行
另外在外层for循环的第一行,要对indexMax,indexMin、max和 min进行置0。重新开始判断下一组数据中的最大最小值