RunMat
GitHub

complex — Construct complex values from real and imaginary parts in MATLAB and RunMat.

z = complex(a, b) constructs a + 1i*b from real-valued inputs. z = complex(a) lifts real values into complex storage with zero imaginary part, following MATLAB semantics.

Syntax

Z = complex(A)
Z = complex(A, B)

Inputs

NameTypeRequiredDefaultDescription
AAnyYesReal numeric input to lift into complex storage.
AAnyYesReal part operand.
BAnyYesImaginary part operand.

Returns

NameTypeDescription
ZNumericArrayComplex result.

Errors

IdentifierWhenMessage
RunMat:complex:InvalidArgumentArgument arity is invalid.complex: invalid argument
RunMat:complex:InvalidInputInput value cannot be converted into real numeric tensor inputs.complex: invalid input
RunMat:complex:SizeMismatchReal and imaginary parts are not compatible for scalar expansion.complex: size mismatch
RunMat:complex:InternalInternal complex tensor construction failed.complex: internal error

How complex works

  • With two inputs, a and b must be real numeric values. Complex inputs raise an error.
  • Two non-scalar inputs must have the same size. If either input is scalar, it expands across the other input.
  • Integer and logical inputs are promoted to double precision before constructing the complex result.
  • String and character inputs are rejected because the constructor accepts numeric inputs only.
  • Unary complex(a) preserves existing complex scalars and complex tensors. Real inputs become complex values with zero imaginary parts.
  • Empty real tensors preserve their empty shape and return empty complex tensors.
  • Real gpuArray inputs remain device-resident when the active provider supports complex construction; two-argument GPU construction preserves MATLAB scalar expansion rules and rejects complex operands.

Does RunMat run complex on the GPU?

Unary complex(A) on a real gpuArray writes [real, 0] interleaved lanes on the device and marks the handle as complex storage.

Binary complex(A, B) accepts real gpuArray and host real operands, uploading host operands as needed, then uses the provider hook to interleave the output on-device with scalar expansion.

If either two-argument operand is already complex, RunMat raises the same real-input error as the host path.

GPU memory and residency

complex keeps real gpuArray inputs resident when the active provider supports complex_from_real and complex_from_real_imag. Outputs use complex-interleaved GPU storage so downstream GPU-aware operations can consume them without a host round trip.

Examples

Constructing a complex scalar from real and imaginary parts

z = complex(3, 4)

Expected output:

z = 3+4i

Constructing a complex row vector from matching real arrays

re = [1 2 3];
im = [4 5 6];
z = complex(re, im)

Expected output:

z = [1+4i 2+5i 3+6i]

Expanding a scalar imaginary part across an array

re = [1 2 3];
z = complex(re, -1)

Expected output:

z = [1-1i 2-1i 3-1i]

Forcing complex storage with a zero imaginary part

z = complex(12);
tf = isreal(z)

Expected output:

z = 12+0i

tf =
     0

Leaving an existing complex value unchanged

z = complex(1 + 2i)

Expected output:

z = 1+2i

Rejecting non-scalar implicit expansion

z = complex([1 2 3], [10; 20])

Expected output:

error: complex: real and imaginary parts must have the same size, unless one input is scalar

Using complex with coding agents

Open a RunMat example with live inputs, then ask the agent to explain how complex changes the result.

Run a small complex example, explain the result, then change one input and compare the output.

FAQ

Does complex(a, b) use MATLAB implicit expansion?

Only scalar expansion is supported for this constructor. Two non-scalar operands must have identical sizes, matching MATLAB's documented complex size rules.

Can I pass complex values to complex(a, b)?

No. The two-argument constructor requires real numeric inputs for both the real and imaginary parts. Use real, imag, or arithmetic if you need to transform existing complex values.

What does unary complex(a) do?

It forces real input into complex storage with a zero imaginary part. If a is already complex, RunMat returns it unchanged.

Why does isreal(complex(5)) return false?

complex(5) stores the value as complex double data with an explicit zero imaginary part. MATLAB and RunMat define isreal by storage, so it returns false.

Does complex accept logical inputs?

Yes. RunMat promotes logical values to doubles (true becomes 1, false becomes 0) before constructing the complex output.

Does complex accept strings or character arrays?

No. Strings and character arrays are rejected because the constructor is limited to numeric inputs.

Can complex run on GPU arrays?

Yes. Real gpuArray inputs are interleaved on the provider into complex GPU storage. Unary complex(A) adds a zero imaginary lane; binary complex(A,B) combines real and imaginary operands with scalar expansion. Complex operands are still rejected in the two-argument form, matching MATLAB's real-input requirement.

Elementwise

abs · angle · conj · double · exp · expm1 · factorial · gamma · heaviside · hypot · imag · ldivide · log · log10 · log1p · log2 · minus · nextpow2 · plus · pow2 · power · rdivide · real · sign · single · sqrt · times

Trigonometry

acos · acosh · asin · asinh · atan · atan2 · atanh · cos · cosd · cosh · deg2rad · rad2deg · sin · sind · sinh · tan · tand · tanh

Reduction

all · any · cummax · cummin · cumprod · cumsum · cumtrapz · diff · gradient · max · mean · median · min · nnz · prod · std · sum · trapz · var

Rounding

ceil · fix · floor · mod · rem · round

Factor

chol · eig · lu · qr · svd

Solve

cond · det · inv · linsolve · norm · null · pinv · rank · rcond · rref

Symbolic

digits · int · limit · sym · syms · vpa

Fft

fft · fft2 · fftshift · ifft · ifft2 · ifftshift

Interpolation

interp1 · interp2 · pchip · ppval · spline

Ode

ode15s · ode23 · ode45

Open-source implementation

Unlike proprietary runtimes, every RunMat function is open-source. Read exactly how complex is executed, line by line, in Rust.

About RunMat

RunMat is an open-source runtime that executes MATLAB-syntax code blazing on any GPU. It is licensed under the Apache 2.0 license.

  • RunMat automatically optimizes your math for GPU execution on Apple, Nvidia, and AMD hardware. No code changes needed. Simulations that took hours now take minutes.
  • Start running code in seconds. RunMat runs in the browser, on the desktop, or from the CLI. No license server, no IT ticket.

Getting started · Benchmarks · Pricing

Download RunMat

Download RunMat for full performance, or use RunMat in your browser for zero setup.