模板 - 矩阵

基于 C++14 标准,实现了矩阵的四则运算,求逆,转置,秩,行列式与对输入输出流的支持

仅在 GCC 下测试过

https://cplib.tifa-233.com/src/code/lalg/mat.hpp 存放了笔者对该算法 / 数据结构的最新实现,建议前往此处查看相关代码

使用说明

  • 元素类型 Tp 须有接受 1 个整数的构造函数,否则需手动偏特化 Matrix::Matrix_helper::Zero (零元) 与 Matrix::Matrix_helper::One (幺元)

  • Gauss-Jordan 消元法有普通版与辗转相除版,其中普通版推荐用于浮点数,辗转相除版推荐用于 \(\mathbb{Z}_m\), gauss(a)gauss_half(a) 默认执行普通版,若需执行辗转相除版需手动偏特化 namespace Matrix::Matrix_helper::gauss_tag, 示例见代码末尾的注释

    当然嫌麻烦也可以直接把 protected 里面的那四个函数暴露出来用,记得同时修改 det(), trans(), rank(), gauss(), gauss_half()

成员函数 & 友元函数简介

符号说明

  • self: 类自身的类型
  • data_t: 元素类型
  • i, j: 正整数
  • s: 元素
  • a, b: 类型为 self 的类
  • un: 一元函数
  • bin: 二元函数

简介

成员函数 / 友元函数返回类型功能调用后是否改变当前类
self(i, j, equ)-构造 ij 列的矩阵,以 equ 作为元素的 operator==, ij0 时抛出 std::logic_error 异常-
self(i, j, s, equ)-构造 ij 列的矩阵,以 equ 作为元素的 operator==, 并将所有元素初始化为 s, ij0 时抛出 std::logic_error 异常-
a.data(i, j) / a.data(i, j) constdata_t&返回 a(i, j)
a.clear()self&清空并返回 a
a.get_row() constconst std::size_t&返回 a 的行数
a.get_col() constconst std::size_t&返回 a 的列数
a.transform_unary(un)self&a 中的所有元素 a(i, j) 改为 un(a(i, j))
a.transform_binary(b, bin)self&a 中的所有元素 a(i, j) 改为 bin(a(i, j), b(i, j))
calc_unary(a, un)self返回 un(a)-
calc_binary(a, b, bin)self返回 bin(a, b)-
gauss(a)std::ptrdiff_ta 应用 Gauss-Jordan 消元法,将 a 化为准对角矩阵,返回 \(\operatorname{rk}(a)\cdot\operatorname{sgn}\det(a)\)
gauss_half(a)std::ptrdiff_ta 应用 Gauss-Jordan 消元法,将 a 化为准上三角矩阵,返回 \(\operatorname{rk}(a)\cdot\operatorname{sgn}\det(a)\)
a.trans()self返回 a 的转置矩阵
a.rank() conststd::size_t返回 a 的秩
a.det() constdata_t返回 a 的行列式值,不存在时抛出 std::runtime_error 异常
a.inverse() constself返回 a 的逆矩阵,不存在时抛出 std::runtime_error 异常
a.add(b), a.minus(b), a.multiply(b), a.divide(b)self&逐元素四则运算
a.add(s), a.minus(s), a.multiply(s), a.divide(s)self&逐元素四则运算
add(a, b), minus(a, b), multiply(a, b), divide(a, b)self&逐元素四则运算-
add(a, s), minus(a, s), multiply(a, s), divide(a, s)self&逐元素四则运算-

代码

Show code

示例

Show code