Java中如何将二维数组作为枚举值存储卷积核矩阵
解决方案
完整枚举实现
public enum ConvolutionKernel { // 预置卷积内核常量 IDENTITY(new double[][]{ {0, 0, 0}, {0, 1, 0}, {0, 0, 0} }), EDGE_DETECTION_1(new double[][]{ {-1, -1, -1}, {-1, 8, -1}, {-1, -1, -1} }), EDGE_DETECTION_2(new double[][]{ {1, 0, -1}, {0, 0, 0}, {-1, 0, 1} }); // 存储二维卷积核的成员变量 private final double[][] kernelMatrix; // 枚举私有构造方法,接收二维数组参数完成初始化 ConvolutionKernel(double[][] kernelMatrix) { // 深拷贝输入数组,避免外部修改枚举内部固定值 int rows = kernelMatrix.length; int cols = kernelMatrix[0].length; this.kernelMatrix = new double[rows][cols]; for (int i = 0; i < rows; i++) { System.arraycopy(kernelMatrix[i], 0, this.kernelMatrix[i], 0, cols); } } /** * 获取完整卷积核数组,返回深拷贝副本 * @return 3x3卷积核二维数组 */ public double[][] getKernelMatrix() { int rows = kernelMatrix.length; int cols = kernelMatrix[0].length; double[][] copy = new double[rows][cols]; for (int i = 0; i < rows; i++) { System.arraycopy(kernelMatrix[i], 0, copy[i], 0, cols); } return copy; } /** * 快捷获取卷积核指定位置的值,无需拷贝整个数组 * @param row 行索引 * @param col 列索引 * @return 对应位置的内核值 */ public double getValue(int row, int col) { return kernelMatrix[row][col]; } }
核心实现逻辑
- 枚举类需要先声明和你要存储的数据类型匹配的成员变量,这里我们用
private final double[][] kernelMatrix存储二维卷积核 - 必须定义对应参数的私有构造方法,枚举实例声明时传入的二维数组会通过构造方法赋值给成员变量
- Java数组是引用类型,构造方法和getter都做深拷贝是为了保证枚举的不可变性,避免外部代码意外修改预置的内核参数
报错原因说明
你收到的「期望类型为数组但实际解析为kernel」的警告,是因为直接对枚举实例做了数组索引操作(比如写了ConvolutionKernel.IDENTITY[0][0]),枚举实例本身是自定义的枚举类型,不是数组,必须先调用getKernelMatrix()拿到内部存储的二维数组后再做索引访问。
使用示例
// 获取边缘检测内核完整数组 double[][] edgeKernel = ConvolutionKernel.EDGE_DETECTION_1.getKernelMatrix(); // 访问内核中心值 double centerValue = edgeKernel[1][1]; // 结果为8 // 快捷获取单个值,性能更高 double identityCenter = ConvolutionKernel.IDENTITY.getValue(1,1); // 结果为1
内容的提问来源于stack exchange,提问作者Conor Timlin
相关产品推荐
相关产品推荐

