Install the C Library:
rindowmatlib.dll (Windows) or librindowmatlib.so (Linux/macOS) is in a system PATH or /usr/local/lib.Composer Install:
composer require rindow/rindow-matlib-ffi rindow/rindow-math-buffer-ffi
First Use Case: Summing an array:
use Rindow\Matlib\FFI\MatlibFactory;
use Rindow\Math\Buffer\FFI\BufferFactory;
use Interop\Polite\Math\Matrix\NDArray;
$factory = new MatlibFactory();
$math = $factory->Math();
$bufferFactory = new BufferFactory();
$x = $bufferFactory->Buffer(64, NDArray::float32);
for ($i = 0; $i < 64; $i++) $x[$i] = $i;
$sum = $math->sum(64, $x, 0, 1); // Sum all elements
rindow-math-buffer-ffi: Required for memory management of numerical arrays.Buffer Initialization:
$buffer = $bufferFactory->Buffer($size, NDArray::float64);
NDArray::float32/float64/int32/int64 for type safety.Matrix Operations:
// Matrix multiplication (C = A * B)
$math->gemm(
$m, $n, $k, // Dimensions
$alpha, $A, $lda, // Matrix A (row-major, stride=lda)
$beta, $B, $ldb, // Matrix B (row-major, stride=ldb)
$C, $ldc // Output matrix C
);
lda, ldb, ldc): Typically rows for row-major matrices.Common Patterns:
sum(), mean(), max(), min().add(), sub(), mul(), div().solve(), eig(), svd() (via gemm/getrf/getrs).einsum() (flexible but slow), einsum4p1() (fast for 4D+1D).Memory Management:
free()—use PHP’s garbage collection.namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Rindow\Matlib\FFI\MatlibFactory;
class MatlibServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('matlib', function () {
return (new MatlibFactory())->Math();
});
}
}
use Illuminate\Support\Facades\Facade;
class MatrixController extends Controller
{
public function multiply()
{
$matlib = app('matlib');
// ... use $matlib->gemm(), etc.
}
}
rindowmatlib (default) for multi-core acceleration.gemm instead of nested for loops).OpenBLAS Conflicts (Linux/macOS):
libopenblas0-pthread is installed and selected via update-alternatives.
sudo apt install libopenblas0-pthread liblapacke
sudo update-alternatives --config libopenblas.so.0
Type Mismatches:
FFI::memoryAccessViolation() or silent corruption.float32/float64) match function expectations. Use NDArray::* constants.Buffer Lifetime:
macOS Quirks:
rindow-math-buffer-ffi may hang in CI (GitHub Actions).Preview Functions:
topk(), gathernd(): Unstable API. Use with caution or wrap in feature flags.$version = $math->getConfig(); // Returns ["version" => "1.1.3", ...]
if (!$x instanceof \Rindow\Math\Buffer\FFI\Buffer) {
throw new \RuntimeException("Invalid buffer");
}
FFI::debug(true);
FFI::memoryAccessViolation: Buffer size/type mismatch.FFI::invalidArgument: Invalid strides/dimensions.Custom Functions:
$ffi = FFI::cdef("
float custom_func(float *x, int n);
", "rindowmatlib.dll");
rindowmatlib with custom symbols.Hybrid PHP/C:
rindowmatlib and expose it via FFI.Laravel Packages:
laravel-matlib) with:
MATLIB_LIBRARY_PATH).$ffi = FFI::load('rindowmatlib', __DIR__.'/vendor/rindow/rindow-matlib-ffi/ext/rindowmatlib.ffi');
How can I help you explore Laravel packages today?