RunMat
GitHub

sortrows — Sort matrix rows lexicographically with MATLAB-compatible column selection and direction controls.

sortrows reorders rows of matrices or character arrays in lexicographic order. It supports MATLAB-compatible controls for comparison columns and per-column ascending/descending direction.

Syntax

B = sortrows(A)
B = sortrows(A, column)
B = sortrows(A, direction)
B = sortrows(A, column, direction)
B = sortrows(A, ..., "ComparisonMethod", method)
B = sortrows(A, ..., "MissingPlacement", placement)
All supported sortrows forms
B = sortrows(A)
B = sortrows(A, column)
B = sortrows(A, direction)
B = sortrows(A, column, direction)
B = sortrows(A, ..., "ComparisonMethod", method)
B = sortrows(A, ..., "MissingPlacement", placement)
[B, I] = sortrows(A)
[B, I] = sortrows(A, column)
[B, I] = sortrows(A, direction)
[B, I] = sortrows(A, column, direction)
[B, I] = sortrows(A, ..., "ComparisonMethod", method)
[B, I] = sortrows(A, ..., "MissingPlacement", placement)

Inputs

NameTypeRequiredDefaultDescription
AAnyYesInput matrix to sort by rows.
columnNumericArrayYesColumn specification vector (negative entries request descending order).
directionStringScalarYes"ascend"Global row direction override: 'ascend' or 'descend'.
argAnyVariadicOptional column and direction arguments.
nameStringScalarYes"ComparisonMethod"Name-value option key.
methodStringScalarYes"auto"Comparison method: 'auto', 'real', or 'abs'.
nameStringScalarYes"MissingPlacement"Name-value option key.
placementStringScalarYes"auto"NaN placement policy: 'auto', 'first', or 'last'.

Returns

NameTypeDescription
BAnySorted input rows.
INumericArrayPermutation indices mapping sorted rows to original rows.

Returned values from sortrows depend on how many outputs the caller requests.

Errors

IdentifierWhenMessage
RunMat:sortrows:InvalidColumnIndexColumn specification indices are out of range, zero, or otherwise invalid.sortrows: invalid column index
RunMat:sortrows:MissingPlacementUnknownMissingPlacement option value is unsupported.sortrows: unsupported MissingPlacement value
RunMat:sortrows:InvalidArgumentOption parsing receives invalid argument kinds or malformed name-value pairs.sortrows: invalid argument

How sortrows works

  • sortrows(A) sorts by column 1, then column 2, and so on, all in ascending order.
  • sortrows(A, C) treats the vector C as the column order. Positive entries sort ascending; negative entries sort descending.
  • sortrows(A, 'descend') sorts all columns in descending order. Combine this with a column vector to mix directions.
  • [B, I] = sortrows(A, ...) also returns I, the 1-based row permutation indices.
  • sortrows is stable: rows that compare equal keep their original order.
  • For complex inputs, 'ComparisonMethod' accepts 'auto', 'real', or 'abs', matching MATLAB semantics.
  • NaN handling mirrors MATLAB: in ascending sorts rows containing NaN values move to the end; in descending sorts they move to the beginning.
  • 'MissingPlacement' lets you choose whether NaN (and other missing) rows appear 'first', 'last', or follow MATLAB's 'auto' default.
  • Character arrays are sorted lexicographically using their character codes.

Does RunMat run sortrows on the GPU?

sortrows is registered as a sink builtin. When the input tensor already lives on the GPU and the active provider exposes a sortrows hook, the runtime delegates to that hook; the current provider contract returns host buffers, so the sorted rows and permutation indices are materialised on the CPU before being returned.

When the provider lacks the hook—or cannot honour a specific combination of options such as 'MissingPlacement','first' or 'MissingPlacement','last'—RunMat gathers the tensor and performs the sort on the host while preserving MATLAB semantics.

Name-value options that the provider does not advertize fall back automatically; callers do not need to special-case GPU vs CPU execution.

The permutation indices are emitted as double-precision column vectors so they can be reused directly for MATLAB-style indexing.

Examples

Sorting rows of a matrix in ascending order

A = [3 2; 1 4; 2 1];
B = sortrows(A)

Expected output:

B =
     1     4
     2     1
     3     2

Sorting by a custom column order

A = [1 4 2; 3 2 5; 3 2 1];
B = sortrows(A, [2 3 1])

Expected output:

B =
     3     2     1
     3     2     5
     1     4     2

Sorting rows in descending order

A = [2 8; 4 1; 3 5];
B = sortrows(A, 'descend')

Expected output:

B =
     4     1
     3     5
     2     8

Mixing ascending and descending directions

A = [1 7 3; 1 2 9; 1 2 3];
B = sortrows(A, [1 -2 3])

Expected output:

B =
     1     7     3
     1     2     3
     1     2     9

Sorting rows of a character array

names = ['bob '; 'al  '; 'ally'];
sorted = sortrows(names)

Expected output:

sorted =
al
ally
bob

Sorting rows of complex data by magnitude

Z = [3+4i, 3; 1+2i, 4];
B = sortrows(Z, 'ComparisonMethod', 'abs')

Expected output:

B =
    1.0000 + 2.0000i    4.0000
    3.0000 + 4.0000i    3.0000

Forcing NaN rows to the top

A = [1 NaN; NaN 2];
B = sortrows(A, 'MissingPlacement', 'first')

Expected output:

B =
   NaN     2
     1   NaN

Sorting GPU-resident data with automatic host fallback

G = gpuArray([3 1; 2 4; 1 2]);
[B, I] = sortrows(G)

Using sortrows with coding agents

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

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

FAQ

Can I request the permutation indices?

Yes. Call [B, I] = sortrows(A, ...) to receive the 1-based row permutation indices in I.

How do I sort specific columns?

Provide a column vector, e.g. sortrows(A, [2 -3]) sorts by column 2 ascending and column 3 descending.

What happens when rows contain NaN values?

Rows containing NaNs move to the bottom for ascending sorts and to the top for descending sorts when 'MissingPlacement' is left at its 'auto' default, matching MATLAB.

How can I force NaNs or missing values to the top or bottom?

Use the name-value pair 'MissingPlacement','first' to place missing rows before finite ones, or 'MissingPlacement','last' to move them to the end regardless of direction.

Does sortrows work with complex numbers?

Yes. Use 'ComparisonMethod','real' to sort by the real component or 'abs' to sort by magnitude (the default behaviour matches MATLAB's 'auto' rules).

Can I combine a direction string with a column vector?

Yes. sortrows(A, [1 3], 'descend') applies descending order to both columns after applying the specified column order.

Is the operation stable?

Yes. Rows that compare equal remain in their original order.

Does sortrows mutate its input?

No. It returns a sorted copy of the input. GPU inputs are gathered to host memory when required.

Are string arrays supported?

String arrays are not yet supported. Convert them to character matrices or use tables before sorting.

What does sortrows do in MATLAB?

sortrows(A) sorts the rows of matrix A in ascending order based on the elements in the first column. Rows with equal first-column values are sorted by subsequent columns.

How do I sort by a specific column in MATLAB?

Use sortrows(A, col) where col is the column index. Use negative values for descending order, e.g., sortrows(A, -2) sorts by the second column in descending order.

Is sortrows a stable sort?

Yes. sortrows uses a stable sorting algorithm, meaning rows with equal sort keys retain their original relative order.

Is there a sortrows equivalent in NumPy or pandas?

— In pandas use df.sort_values(by=['col1', 'col2'], ascending=[True, False]). In NumPy there is no direct sortrows, but A[np.lexsort(A.T[::-1])] sorts rows lexicographically (NumPy's lexsort reads its keys in reverse priority, so the [::-1] restores MATLAB's left-to-right order). For descending columns, negate the corresponding key: np.lexsort([-A[:, 1], A[:, 0]]).

How do I sort by multiple columns with different directions?

— Pass a signed column vector as the second argument. Positive entries sort ascending, negative entries sort descending. For example, sortrows(A, [1 -2]) sorts column 1 ascending and column 2 descending, and sortrows(A, [3 -1 2]) orders by column 3 ascending, column 1 descending, then column 2 ascending as a tiebreaker. You can also write sortrows(A, [1 2], {'ascend','descend'}) for the equivalent name-based form.

Sorting Sets

argsort · intersect · ismember · issorted · setdiff · sort · union · unique

Shape

cat · circshift · diag · flip · fliplr · flipud · horzcat · ipermute · kron · permute · repelem · repmat · reshape · rot90 · squeeze · tril · triu · vertcat

Creation

colon · eye · false · fill · linspace · logspace · magic · meshgrid · ones · peaks · rand · randi · randn · randperm · range · true · zeros

Indexing

find · ind2sub · sub2ind

Introspection

isempty · ismatrix · isscalar · isvector · length · ndims · numel · size

Open-source implementation

Unlike proprietary runtimes, every RunMat function is open-source. Read exactly how sortrows 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.