stack!() { /* proc-macro */ }
Expand description
Construct a new matrix by stacking matrices in a block matrix.
Note: Requires the macros
feature to be enabled (enabled by default).
This macro facilitates the construction of
block matrices
by stacking blocks (matrices) using the same MATLAB-like syntax as the matrix!
and
dmatrix!
macros:
// a, b, c and d are matrices
let block_matrix = stack![ a, b;
c, d ];
The resulting matrix is stack-allocated if the dimension of each block row and column can be determined at compile-time, otherwise it is heap-allocated. This is the case if, for every row, there is at least one matrix with a fixed number of rows, and, for every column, there is at least one matrix with a fixed number of columns.
stack!
also supports special syntax to indicate zero blocks in a matrix:
// a and d are matrices
let block_matrix = stack![ a, 0;
0, d ];
Here, the 0
literal indicates a zero matrix of implicitly defined size.
In order to infer the size of the zero blocks, there must be at least one matrix
in every row and column of the matrix.
In other words, no row or column can consist entirely of implicit zero blocks.
§Panics
Panics if dimensions are inconsistent and it cannot be determined at compile-time.
§Examples
use nalgebra::{matrix, SMatrix, stack};
let a = matrix![1, 2;
3, 4];
let b = matrix![5, 6;
7, 8];
let c = matrix![9, 10];
let block_matrix = stack![ a, b;
c, 0 ];
assert_eq!(block_matrix, matrix![1, 2, 5, 6;
3, 4, 7, 8;
9, 10, 0, 0]);
// Verify that the resulting block matrix is stack-allocated
let _: SMatrix<_, 3, 4> = block_matrix;
The example above shows how stacking stack-allocated matrices results in a stack-allocated block matrix. If all row and column dimensions can not be determined at compile-time, the result is instead a dynamically allocated matrix:
use nalgebra::{dmatrix, DMatrix, Dyn, matrix, OMatrix, SMatrix, stack, U3};
// a and c as before, but b is a dynamic matrix this time
let b = dmatrix![5, 6;
7, 8];
// In this case, the number of rows can be statically inferred to be 3 (U3),
// but the number of columns cannot, hence it is dynamic
let block_matrix: OMatrix<_, U3, Dyn> = stack![ a, b;
c, 0 ];
// If necessary, a fully dynamic matrix (DMatrix) can be obtained by reshaping
let dyn_block_matrix: DMatrix<_> = block_matrix.reshape_generic(Dyn(3), Dyn(4));
Note that explicitly annotating the types of block_matrix
and dyn_block_matrix
is
only made for illustrative purposes, and is not generally necessary.