double ds; gan_mat34_scale_q ( &m34A, ds, &m34C ); /* macro */ m34C = gan_mat34_scale_s ( &m34A, ds ); /* function call */ gan_mat34_scale_i ( &m34A, ds ); /* macro, result in-place in m34A */to divide a matrix by a (non-zero) scalar
gan_mat34_divide_q ( &m34A, ds, &m34C ); /* macro */ m34C = gan_mat34_divide_s ( &m34A, ds ); /* function call */ gan_mat34_divide_i ( &m34A, ds ); /* macro, result in-place in m34A */to negate a matrix
gan_mat34_negate_q ( &m34A, &m34C ); /* macro */ m34C = gan_mat34_negate_s ( &m34A ); /* function call */ gan_mat34_negate_i ( &m34A ); /* macro, result in-place in m34A */and to scale a matrix to unit unit Frobenius norm
gan_mat34_unit_q ( &m34A, &m34C ); /* macro */ m34C = gan_mat34_unit_s ( &m34A ); /* function call */ gan_mat34_unit_i ( &m34A ); /* macro, result in-place in m34A */The Frobenius norm of a matrix is the square-root of the sum of squares of the matrix elements. The Gandalf functions for computing it are described in 3.1.2.11.
Equivalent routiness to the above for multiplying/dividing a matrix by a scalar, negating a matrix and scaling a matrix to unit Frobenius norm are available for square fixed size matrices. Without listing the routines exhaustively, some examples are
gan_mat33_scale_q ( &m33A, ds, &m33C ); /* macro */ sm33Sc = gan_symmat33_divide_s ( &sm33Sa, ds ); /* function call */ gan_ltmat33_negate_i ( &sm33La ); /* macro, result in-place in sm33La */ m33C = gan_mat33_unit_s ( &m33A ); /* function call */
Error detection: If zero is passed as the scalar value to the ..._divide_[qi]() routines, NULL will be returned, while the ..._divide_s() routines will abort the program. You should add tests for division by zero before calling any of the ..._divide_[qsi]() routines. Similarly, the ..._unit_[qsi]() routines will fail if the input matrix contains only zeros. If this is a possibility then the program should check beforehand.