You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需暴力枚举的传感器原始与校准数据全组合生成方法

实现思路

  • 首先生成校准数组的所有无重复全排列,对应6种轴配对规则
  • 生成所有符号组合,每个原始值、每个校准值均可取正负,共2^6=64种符号规则
  • 遍历所有排列+符号的组合,生成符合要求的配对数组后调用processPair方法即可,无需手动枚举所有384种情况

完整Java实现代码

import java.util.ArrayList;
import java.util.List;

public class SensorCombinationGenerator {
    public static void main(String[] args) {
        float[] rawValues = {169.58185f, 20.343851f, 1.4982328f};
        float[] calValues = {110.131454f, 4.442127f, 7.5981708f};
        
        // 生成校准值的所有全排列
        List<float[]> calPermutations = new ArrayList<>();
        generatePermutations(calValues, 0, calPermutations);
        
        // 遍历所有配对排列
        for (float[] calPerm : calPermutations) {
            // 遍历所有64种符号组合,二进制位0-2对应原始值符号,3-5对应校准值符号
            for (int signFlag = 0; signFlag < 64; signFlag++) {
                float[] processedRaw = new float[3];
                float[] processedCal = new float[3];
                
                // 生成带符号的原始值数组
                for (int i = 0; i < 3; i++) {
                    int sign = ((signFlag >> i) & 1) == 1 ? -1 : 1;
                    processedRaw[i] = rawValues[i] * sign;
                }
                
                // 生成带符号的当前排列校准值数组
                for (int i = 0; i < 3; i++) {
                    int sign = ((signFlag >> (i + 3)) & 1) == 1 ? -1 : 1;
                    processedCal[i] = calPerm[i] * sign;
                }
                
                // 调用自定义处理方法
                processPair(processedRaw, processedCal);
            }
        }
    }

    // 回溯法生成数组全排列
    private static void generatePermutations(float[] arr, int depth, List<float[]> permutations) {
        if (depth == arr.length) {
            permutations.add(arr.clone());
            return;
        }
        for (int i = depth; i < arr.length; i++) {
            swap(arr, depth, i);
            generatePermutations(arr, depth + 1, permutations);
            swap(arr, depth, i); // 回溯复位
        }
    }

    private static void swap(float[] arr, int i, int j) {
        float temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    // 你的原有处理方法,此处仅做示例
    private static void processPair(float[] raw, float[] cal) {
        // 原有业务逻辑
    }
}

逻辑验证

  • 最终生成的组合总数为 6 * 64 = 384,完全覆盖所有需求场景
  • 如果后续确认某类数值不需要变号,仅需要修改符号判断逻辑和循环范围即可,扩展性较强

内容的提问来源于stack exchange,提问作者confused

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:30:01