类 FastHadamardTransformer

java.lang.Object
org.hipparchus.transform.FastHadamardTransformer
所有已实现的接口:
Serializable, RealTransformer

public class FastHadamardTransformer extends Object implements RealTransformer, Serializable
实现了快速哈达玛变换(FHT)。将输入向量x转换为输出向量y。

除了对实向量进行变换外,哈达玛变换还可以将整数向量转换为整数向量。然而,这种整数变换不能直接反转。由于存在缩放因子,可能导致有理数结果。例如,整数向量(0, 1, 0, 1)的逆变换是有理数向量(1/2, -1/2, 0, 0)。

另请参阅:
  • 构造器概要

    构造器
    构造器
    说明
    空构造函数。
  • 方法概要

    修饰符和类型
    方法
    说明
    protected double[]
    fht(double[] x)
    仅使用减法和加法的FHT(快速哈达玛变换)。
    protected int[]
    fht(int[] x)
    返回指定整数数据集的正向变换。
    double[]
    transform(double[] f, TransformType type)
    返回指定实数据集的(正向、反向)变换。
    int[]
    transform(int[] f)
    返回指定整数数据集的正向变换。由于可能导致双精度结果的缩放因子,整数变换不能直接反转。
    double[]
    transform(UnivariateFunction f, double min, double max, int n, TransformType type)
    返回指定实函数在指定区间上采样的(正向、反向)变换。

    从类继承的方法 java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 构造器详细资料

    • FastHadamardTransformer

      public FastHadamardTransformer()
      空构造函数。

      这个构造函数并非必需,但它可以防止在JDK 18及更高版本中出现虚假的javadoc警告。

      从以下版本开始:
      3.0
  • 方法详细资料

    • transform

      public double[] transform(double[] f, TransformType type)
      返回指定实数据集的(正向、反向)变换。
      指定者:
      transform 在接口中 RealTransformer
      参数:
      f - 要转换的实数据数组(信号)
      type - 要执行的变换类型(正向、反向)
      返回:
      转换后的实数组(频谱)
      抛出:
      MathIllegalArgumentException - 如果数据数组的长度不是2的幂
    • transform

      public double[] transform(UnivariateFunction f, double min, double max, int n, TransformType type)
      返回指定在指定区间上采样的实函数的(正向、反向)变换。
      指定者:
      transform 在接口中 RealTransformer
      参数:
      f - 要采样和变换的函数
      min - 区间的(包含)下界
      max - 区间的(不包含)上界
      n - 样本点的数量
      type - 要执行的变换类型(正向、反向)
      返回:
      转换后的实数组
      抛出:
      MathIllegalArgumentException - 如果下界大于或等于上界
      MathIllegalArgumentException - 如果样本点数量为负
      MathIllegalArgumentException - 如果样本点数量不是2的幂
    • transform

      public int[] transform(int[] f)
      返回指定整数数据集的正向变换。由于可能导致双精度结果的缩放因子,整数变换不能直接反转。
      参数:
      f - 要转换的整数数据数组(信号)
      返回:
      转换后的整数数组(频谱)
      抛出:
      MathIllegalArgumentException - 如果数据数组的长度不是2的幂
    • fht

      protected double[] fht(double[] x) throws MathIllegalArgumentException
      FHT(快速哈达玛变换)仅使用减法和加法。需要 N * log2(N) = n * 2^n 次加法。
      1. x 是要转换的输入向量,
      2. y 是输出向量(x 的快速哈达玛变换),
      3. a 和 b 是辅助行。
      N=8 的手动计算简表
      x a b y
      x0 a0 = x0 + x1 b0 = a0 + a1 y0 = b0+ b1
      x1 a1 = x2 + x3 b0 = a2 + a3 y0 = b2 + b3
      x2 a2 = x4 + x5 b0 = a4 + a5 y0 = b4 + b5
      x3 a3 = x6 + x7 b0 = a6 + a7 y0 = b6 + b7
      x4 a0 = x0 - x1 b0 = a0 - a1 y0 = b0 - b1
      x5 a1 = x2 - x3 b0 = a2 - a3 y0 = b2 - b3
      x6 a2 = x4 - x5 b0 = a4 - a5 y0 = b4 - b5
      x7 a3 = x6 - x7 b0 = a6 - a7 y0 = b6 - b7

      工作原理

      1. 构建一个具有 N 行和 n + 1 列的矩阵,hadm[n+1][N]
        (如果我使用 [x][y],它总是表示具有 n 行和 m 列的矩阵的 [行偏移][列偏移]。其条目从 M[0][0] 到 M[n][N])
      2. 将输入向量 x[N] 放入矩阵 hadm 的第一列。
      3. 子矩阵 D_top 的条目计算如下
        • D_top 从条目 [0][1][N / 2 - 1][n + 1]
        • D_top 的列是前一列的成对互斥和。
      4. 子矩阵 D_bottom 的条目计算如下
        • D_bottom 从条目 [N / 2][1][N][n + 1]
        • D_bottom 的列是前一列的成对差异。
      5. D_topD_bottom 的计算最好通过上述示例(对于 N = 8)理解。
      6. 输出向量 y 现在在 hadm 的最后一列中。
      7. 算法来自 chipcenter
      可视化
      0 1 2 3 n + 1
      0 x0
      ← Dtop
      1 x1
      2 x2
      N / 2 - 1 xN/2-1
      N / 2 xN/2
      ← Dbottom
      N / 2 + 1 xN/2+1
      N / 2 + 2 xN/2+2
      N xN
      参数:
      x - 要转换的实数数据数组
      返回:
      实数转换后的数组,y
      抛出:
      MathIllegalArgumentException - 如果数据数组的长度不是2的幂
    • fht

      protected int[] fht(int[] x) throws MathIllegalArgumentException
      返回指定整数数据集的正向变换。FHT(快速哈达玛变换)仅使用减法和加法。
      参数:
      x - 要转换的整数数据数组
      返回:
      整数转换后的数组,y
      抛出:
      MathIllegalArgumentException - 如果数据数组的长度不是2的幂