Multik 0.3.0 Help

Complex numbers

Overview

Multik supports complex-valued data through two element types:

  • ComplexFloat — single-precision complex numbers

  • ComplexDouble — double-precision complex numbers

These types behave like regular numeric values with re (real) and im (imaginary) parts, and they can be stored in ndarrays just like other primitive numeric types.

Creating complex values

val z1 = ComplexFloat(1f, -2f) val z2 = ComplexDouble(3.0, 4.0) val i1 = 1f.i // 0 + 1i (ComplexFloat) val i2 = 2.0.i // 0 + 2i (ComplexDouble) val real = 5.0.toComplexDouble() // 5 + 0i

ComplexFloat and ComplexDouble provide useful helpers:

val z = ComplexDouble(1.0, -2.0) val conj = z.conjugate() val magnitude = z.abs() val angle = z.angle()

Creating complex ndarrays

You can build complex arrays using literals or dedicated complex array builders.

val a = mk.ndarray( mk[ ComplexDouble(1.0, 2.0), ComplexDouble(3.0, -1.0) ] ) val b = mk.ones<ComplexFloat>(2, 2)

From complex primitive arrays:

val data = complexDoubleArrayOf(1.0 + 2.0.i, 3.0 + 4.0.i, 5.0 + 6.0.i) val c = mk.ndarray(data)

You can also generate complex grids with index-based factories:

val grid = mk.d2arrayIndices(2, 3) { i, j -> ComplexFloat(i.toFloat(), j.toFloat()) }

Arithmetic with complex arrays

Complex ndarrays support the usual element-wise operations:

val x = mk.ndarray(mk[ComplexDouble(1.0, 1.0), ComplexDouble(2.0, -1.0)]) val y = mk.ndarray(mk[ComplexDouble(0.5, 0.0), ComplexDouble(1.0, 2.0)]) val sum = x + y val product = x * y

When adding or multiplying by scalars, use complex scalars:

val scaled = x + 2.0.toComplexDouble()

Math functions

Many math functions work with complex arrays. For example:

val w = x.exp() val s = x.sin() val magnitudes = x.map { it.abs() }

Converting between real and complex types

You can cast a real array to a complex type with toType, which sets the imaginary part to zero:

val real = mk.ndarray(mk[1.0, 2.0, 3.0]) val complex = real.toType<Double, ComplexDouble, D1>()
28 February 2026