iwillfling 2023-07-24 17:38 采纳率: 50%
浏览 39
已结题

用php 将不连续数据转为等间距连续数据

有数据集如下:每行一组,可看成是(X,Y)用逗号分隔。 要求用php 写一个方法,将X值等间距,并得出对应Y值。
0.0,44.470,
0.56,44.47,
1.08,44.46,
12.44,44.37,
14.05,44.50,
14.53,0.00,
15.19,0.00,
18.95,44.11,
23.64,43.50,
29.27,43.45,
30.81,43.28,

要求结果如下:
0, 44.470
1,Y
2,Y
3,Y
4,Y
中间省略
30,Y
X是等间距,Y值需要根据前后值生成平均数,呈线性关系。个别明显有误的点需要清除。 例如(14.53,0.00)。

  • 写回答

9条回答 默认 最新

  • 日霄科技 2023-07-24 17:48
    关注
    
    <?php
    
    function interpolateData($data) {
      $result = array();
      $lastValidY = null;
      
      foreach ($data as $index => $entry) {
        $values = explode(',', $entry);
        $x = intval($values[0]);
        $y = floatval($values[1]);
        
        if ($index === 0) {
          $result[$x] = $y;
        } else {
          $prevX = $lastX;
          $prevY = $lastValidY !== null ? $lastValidY : $lastY;
          
          $diffX = $x - $prevX;
          $diffY = $y - $prevY;
          
          if ($diffX > 1) {
            $stepY = $diffY / $diffX;
            
            for ($i = 1; $i < $diffX; $i++) {
              $interpolatedX = $prevX + $i;
              $interpolatedY = $prevY + ($stepY * $i);
              
              $result[$interpolatedX] = $interpolatedY;
            }
          }
          
          $result[$x] = $y;
          
          if ($y !== 0) {
            $lastValidY = $y;
          }
        }
        
        $lastX = $x;
        $lastY = $y;
      }
      
      return $result;
    }
    
    // 使用示例
    $data = [
      "0.0,44.470",
      "0.56,44.47",
      "1.08,44.46",
      "12.44,44.37",
      "14.05,44.50",
      "14.53,0.00",
      "15.19,0.00",
      "18.95,44.11",
      "23.64,43.50",
      "29.27,43.45",
      "30.81,43.28"
    ];
    
    $interpolatedData = interpolateData($data);
    
    foreach ($interpolatedData as $x => $y) {
      echo "{$x}, " . ($y !== 0 ? $y : 'Y') . PHP_EOL;
    }
    
    ?>
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月25日
  • 创建了问题 7月24日