如何在Java中简单实现与Matlab prctile功能一致的百分位数计算函数
Java实现与Matlab对齐的百分位数(带线性插值)
实现逻辑说明
完全对齐Matlab prctile 函数默认的线性插值计算规则,计算步骤如下:
- 校验输入合法性:输入数组非空、百分位参数取值范围为[0,100]
- 拷贝输入数组后做升序排序,不修改原数组
- 边界场景直接返回:百分位为0时返回数组最小值,为100时返回数组最大值
- 计算插值位置(适配Java 0基索引):
pos = (percentile / 100.0) * (sortedArr.length - 1) - 若pos为整数,直接返回对应下标的元素;否则取下标整数部分和小数部分做线性插值计算结果
完整代码实现
import java.util.Arrays; public class PercentileCalculator { public static double percentile(double[] arr, int percentile) { // 输入参数校验 if (arr == null || arr.length == 0) { throw new IllegalArgumentException("输入数组不能为空"); } if (percentile < 0 || percentile > 100) { throw new IllegalArgumentException("百分位参数需在0到100之间"); } // 拷贝数组后排序,避免修改原数组 double[] sortedArr = Arrays.copyOf(arr, arr.length); Arrays.sort(sortedArr); int n = sortedArr.length; // 边界值直接返回 if (percentile == 0) { return sortedArr[0]; } if (percentile == 100) { return sortedArr[n - 1]; } // 计算插值位置 double pos = (percentile / 100.0) * (n - 1); int floorPos = (int) Math.floor(pos); double fraction = pos - floorPos; // 线性插值计算结果 return sortedArr[floorPos] + fraction * (sortedArr[floorPos + 1] - sortedArr[floorPos]); } // 测试示例 public static void main(String[] args) { double[] testArr = {1, 3, 5, 7, 9}; // 50百分位输出5,和Matlab prctile(testArr,50)结果一致 System.out.println(percentile(testArr, 50)); // 30百分位输出3.4,和Matlab prctile(testArr,30)结果一致 System.out.println(percentile(testArr, 30)); } }
以上实现适配Matlab R2017a及后续版本prctile函数的默认计算规则,若需适配更早版本的其他计算模式,调整pos计算公式即可。
内容的提问来源于stack exchange,提问作者Suraj Kulkarni
相关产品推荐
相关产品推荐

