Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FastMath Logo

FastMath

简单而强大的 Java SIMD 数学编程库

Java Version Maven License JUnit

FastMath

基于 Java Vector API (SIMD) 的高性能数学库,提供向量化的数组运算、快速标量数学函数、矩阵运算、复数运算和 FFT 功能。

特性

  • SIMD 加速数组运算 — 利用 Java Vector API 对 float/double 数组进行向量化处理,一条指令同时处理多个数据元素
  • 快速标量数学函数 — 使用查找表和 IEEE 754 位操作的近似实现,以少量精度换取显著性能提升
  • 矩阵运算 — 支持矩阵创建、加减乘、矩阵向量乘法、转置、行列式、逆矩阵等
  • 复数运算 — 提供单精度 (Complex) 和双精度 (ComplexD) 不可变复数类型,以及基于交错存储格式的批量复数数组操作 (ComplexMath)
  • 快速傅里叶变换 — 基于 Cooley-Tukey 算法的迭代原地 FFT 实现,支持实数 FFT (RFFT)、卷积和相关性计算
  • 2D/3D/4D 向量 — 提供不可变的 Vec2Vec3Vec4 类型,适用于图形和物理计算
  • JMH 基准测试 — 内置性能基准测试框架,可对比标量实现与 SIMD 实现的性能差异

系统要求

  • JDK 26+(Vector API 需要最新 JDK 版本)
  • Maven 3.8+

快速开始

前置要求

  • Java 26+
  • Maven 3.8+

安装依赖

<dependency>
    <groupId>io.github.tuyucheng777</groupId>
    <artifactId>fastmath</artifactId>
    <version>1.0.0</version>
</dependency>

模块概览

VectorMath — SIMD 向量数组运算

float[] a = {1, 2, 3, 4, 5, 6, 7, 8};
float[] b = {2, 2, 2, 2, 2, 2, 2, 2};

float[] sum      = VectorMath.add(a, b);        // 逐元素加法
float[] product  = VectorMath.multiply(a, b);   // 逐元素乘法
float  dot       = VectorMath.dotProduct(a, b);  // 点积
float  norm      = VectorMath.norm(a);           // L2 范数
float[] sqrtArr  = VectorMath.sqrt(a);           // 逐元素平方根
float[] normalized = VectorMath.normalize(a);    // 归一化
float  dist      = VectorMath.distance(a, b);    // 欧几里得距离
float[] clamped  = VectorMath.clamp(a, 0, 10);  // 范围裁剪
float[] lerped   = VectorMath.lerp(a, b, 0.5f); // 线性插值

支持的操作:addsubtractmultiplydividedotProductsumnormnormalizedistancedistanceSquaredminmaxsqrtnegateabspowclamplerp。所有操作同时提供 float 和 double 版本。

FastMath — 快速标量数学函数

float sinVal  = FastMath.sin(0.785f);    // 查找表近似 sin
float cosVal  = FastMath.cos(0.785f);    // 查找表近似 cos
float expVal  = FastMath.exp(2.0f);      // IEEE 754 近似 e^x
float logVal  = FastMath.log(10.0f);     // IEEE 754 近似 ln(x)
float sqrtVal = FastMath.sqrt(16.0f);    // Newton-Raphson 近似 √x
float invSqrt = FastMath.invSqrt(4.0f);  // Quake III 快速逆平方根 1/√x
float angle   = FastMath.atan2(1.0f, 1.0f); // 快速 atan2
float clamped = FastMath.clamp(x, 0, 10);    // 范围裁剪
float lerped  = FastMath.lerp(a, b, 0.5f);   // 线性插值

三角函数:sincostanasinacosatanatan2 指数/对数:exploglog10log2pow 根/逆:sqrtinvSqrt 实用:absfloorceilroundminmaxclamplerpsmoothstepsign

大多数函数的相对误差小于 1e-6 或更优。

Complex / ComplexD — 复数

Complex a = new Complex(3, 4);       // 3 + 4i
Complex b = Complex.fromPolar(5, 0.927f); // 5 * e^(i*0.927)

Complex c = a.add(b);                // 加法
Complex d = a.multiply(b);           // 乘法
Complex e = a.conjugate();           // 3 - 4i
Complex f = a.sqrt();                // 平方根
Complex g = a.exp();                 // e^(a+bi)
Complex h = a.pow(3);                // 快速幂(整数指数)

float magnitude = a.abs();          // 5.0
float phase     = a.phase();        // 0.927 rad

ComplexD 提供相同的操作,使用 double 精度。

ComplexMath — 批量复数数组运算

float[] a = ComplexMath.fromArrays(realArr, imagArr);  // 从独立数组创建
float[] result = ComplexMath.add(a, b);                // 逐元素加法
float[] product = ComplexMath.multiply(a, b);          // 逐元素复数乘法
float[] conjugated = ComplexMath.conjugate(a);         // 共轭
float[] magnitudes = ComplexMath.abs(a);               // 模
float[] phases = ComplexMath.phase(a);                 // 相位
float[] exponential = ComplexMath.exp(a);              // e^z
Complex dot = ComplexMath.dotProduct(a, b);            // 复数点积

复数以交错格式存储:[re0, im0, re1, im1, ...],适合高效 SIMD 处理。

FFT — 快速傅里叶变换

float[] signal = new float[1024 * 2]; // 512 个复数(交错格式)
// ... 填充信号数据 ...

float[] spectrum     = FFT.fft(signal);     // 前向 FFT(原地)
float[] spectrumCopy = FFT.fftCopy(signal); // 前向 FFT(返回新数组)
float[] reconstructed = FFT.ifft(spectrum);  // 逆 FFT

// 实数 FFT(利用对称性,只返回一半频谱)
float[] realSignal = new float[1024];
float[] halfSpectrum = FFT.rfft(realSignal);
float[] recovered = FFT.irfft(halfSpectrum, 1024);

// 卷积
float[] convResult = FFT.convolve(a, b);

// 工具方法
int fftSize = FFT.nextPowerOfTwo(1000); // 1024
boolean isPow2 = FFT.isPowerOfTwo(256);  // true

FFT 长度必须是 2 的幂。使用 FFT.nextPowerOfTwo() 获取有效长度。同时提供 double 精度版本。

MatrixMath — 矩阵运算

float[] identity = MatrixMath.identity(3);               // 3x3 单位矩阵
float[] product = MatrixMath.multiply(a, b, 2, 2, 2);    // 2x2 矩阵乘法
float[] result = MatrixMath.multiplyVector(m, v, 3, 3);   // 矩阵-向量乘法
float[] transposed = MatrixMath.transpose(m, 2, 3);       // 转置
float det = MatrixMath.determinant2x2(m);                  // 2x2 行列式
float[] inv = MatrixMath.inverse2x2(m);                    // 2x2 逆矩阵
float norm = MatrixMath.frobeniusNorm(m, 3, 3);            // Frobenius 范数

矩阵使用一维数组按行优先存储:element(i, j) = array[i * cols + j]

VectorOps — 2D/3D/4D 向量

VectorOps.Vec3 v1 = new VectorOps.Vec3(1, 2, 3);
VectorOps.Vec3 v2 = new VectorOps.Vec3(4, 5, 6);

VectorOps.Vec3 sum = v1.add(v2);           // 加法
VectorOps.Vec3 cross = v1.cross(v2);        // 叉积
float dot = v1.dot(v2);                     // 点积
VectorOps.Vec3 normalized = v1.normalize(); // 归一化
VectorOps.Vec3 reflected = v1.reflect(n);   // 反射
VectorOps.Vec3 projected = v1.project(v2);  // 投影
float angle = v1.angleBetween(v2);          // 角度

支持 Vec2Vec3Vec4,均为不可变类型。

项目结构

src/main/java/cn/tuyucheng/taketoday/fastmath/
├── FastMath.java         — 快速标量数学函数
├── VectorMath.java       — SIMD 向量数组运算
├── MatrixMath.java       — 矩阵运算
├── Complex.java          — 单精度复数(不可变)
├── ComplexD.java         — 双精度复数(不可变)
├── ComplexMath.java      — 批量复数数组运算
├── VectorOps.java        — 2D/3D/4D 向量类
├── FFT.java              — 快速傅里叶变换
└── benchmark/
    ├── BenchmarkRunner.java      — JMH 基准测试入口
    └── VectorMathBenchmark.java  — 基准测试用例

src/test/java/cn/tuyucheng/taketoday/fastmath/
├── FastMathTest.java     — FastMath/VectorMath/MatrixMath/VectorOps 测试
├── ComplexTest.java      — Complex/ComplexD/ComplexMath/FFT 测试

技术栈

技术 版本
Java 26+
Java Vector API jdk.incubator.vector (Preview)
JUnit 5 5.10.2
JMH 1.37
Maven 3.8+

编译参数

编译和运行时需要启用 Vector API 预览特性:

javac --enable-preview --add-modules=jdk.incubator.vector ...
java --enable-preview --add-modules=jdk.incubator.vector ...

Maven 已在 pom.xml 中配置了这些参数,直接使用 mvn 命令即可。

About

High-performance math library using Java Vector API (requires JDK 26+)

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages