定位峰的方法有很多种。考虑一组数据x []。对于我们的项目,我们将峰值定义为数组的元素,该元素是局部最大值,比其每个邻居大2或更多。数组中的第一个和最后一个元素每个只有一个邻居,根据定义,它们不能是峰值。因此,给定此数组x []包含20个元素:
0.20 0.50 0.10 0.15 0.20 0.13 0.30 0.25 0.30 0.30(元素0-9)
0.70 0.20 0.45 0.15 0.20 0.85 0.30 0.65 0.20 0.10(元素10-19)
峰值为x [1] = 0.5,x [10] = 0.7,x [12] = 0.45,x [15] = 0.85,x [17] = 0.65。
对于此项目,您将编写一个程序,该程序扫描数据数组,根据上面定义的标准查找峰值,并且(对于额外信用)将它们按升序排序。这是你的程序应该做的:
声明并初始化20个浮点数的数组x []。
float [] x = {0.2f,0.5f,0.1f,0.15f,0.2f,0.13f,0.3f,0.25f,0.3f,0.3f, 0.7f,0.2f,0.45f,0.15f,0.2f,0.85f,0.3f,0.65f,0.2f,0.1f};
在每一行上打印x [],10的元素,精度为2位小数。
在x []中找到峰值,并将它们的索引存储在名为peaks []的数组中。
按照它们在x []中出现的顺序打印每个峰的索引和数据。
到目前为止,我的代码如下:
float[] x = {0.2f, 0.5f, 0.1f, 0.15f, 0.2f, 0.13f, 0.3f, 0.25f, 0.3f, 0.3f,
0.7f, 0.2f, 0.45f, 0.15f, 0.2f, 0.85f, 0.3f, 0.65f, 0.2f, 0.1f};
int numPeaks = 0; // Amount of peaks found.
int[] peaks = new int[x.length];
System.out.println("Data array:"); // Print header.
// Print out data.
for (int i = 0; i < x.length; i++) {
System.out.printf("%.2f ", x[i]);
if (i == (x.length - 1) / 2) {
System.out.println();
}
}
System.out.println("\n"); // Double line break.
// Search for peaks and stores them into peaks[i].
// Also counts how many peaks there are.
for (int i = 1; i < x.length - 1; i++) {
if (x[i] > (x[i-1] * 2) && x[i] > (x[i+1] * 2)) {
numPeaks++;
peaks[i] = i;
}
}
// Print number of peaks found.
System.out.println(numPeaks + " peaks found:");
// Print only the peaks found along with their indices.
for (int i = 1; i < x.length - 1; i++) {
if (x[i] > (x[i-1] * 2) && x[i] > (x[i+1] * 2)) {
System.out.printf("%2d", peaks[i]);
System.out.println(" " + x[i]);
}
}
和输出:
Data array:
0.20 0.50 0.10 0.15 0.20 0.13 0.30 0.25 0.30 0.30
0.70 0.20 0.45 0.15 0.20 0.85 0.30 0.65 0.20 0.10
5 peaks found:
1 0.5
10 0.7
12 0.45
15 0.85
17 0.65
我希望输出看起来像这样:
Data array:
0.20 0.50 0.10 0.15 0.20 0.13 0.30 0.25 0.30 0.30
0.70 0.20 0.45 0.15 0.20 0.85 0.30 0.65 0.20 0.10
5 peaks found:
1 0.5
10 0.7
12 0.45
15 0.85
17 0.65
Sorted peaks:
12 0.45
1 0.5
17 0.65
10 0.7
15 0.85
17 0.65
我似乎无法正确地将元素索引附加到已排序的浮动数据。如果有人可以提供帮助,请提前致谢。
如果有任何我遗漏的信息,请询问
答案 0 :(得分:0)
此处的解决方案是使用比较原始数据中的值的比较对您peaks
数组进行排序。
如果您使用的是Java 8,则可以使用Integer
个对象而不是int
,然后使用比较器:
Integer[] peaks;
Arrays.sort(peaks, Comparator.comparing(i -> x[i]));
您可以在Java 7中执行相同的操作,但您需要创建自己的比较器。