SLISC 矩阵的基本运算

                     

贡献者: addis

预备知识 SLISC 的矢量和矩阵

   先给一个具体的例程

#include "SLISC/arithmetic.h"
int main()
{
    VecDoub v(4); // 长度为 4 的 double 矢量
    linspace(v, 1, 4); // 等间距赋值, v = [1,2,3,4]
    cout << "max(v) = " << max(v) << endl; // 最大值 (4)
    cout << "sum_abs(v) = " << sum_abs(v) << endl; // 绝对值求和 (10)
    cout << "norm2(v) = " << norm2(v) << endl; // 绝对值平方和
    resize_cpy(v, 6); // 长度变为 6, 保留前 4 个元素的值
}

   以下简单列出 arithmetic.h 中的函数,用于对矩阵进行基本运算。以下 T 代表某种容器类型,T1 代表另一种容器类型,Ts 代表某种标量类型,Tr 代表某种实数类型。

   Long size(T_I v) 相当于 std::vector.size(),但返回 Long 类型,这是为了避免使用 unsigned 类型。

   Tr sum_abs(T_I v) 绝对值求和 $\sum_i \left\lvert v_i \right\rvert $

   Ts max(T_I v)Ts min(T_I v) 最大元素和最小元素

   Ts max(Long_O ind, T_I v)Ts min(Long_O ind, T_I v) 最大元素和最小元素(同时求出其位置)

   Tr max_abs(T_I v) 最大绝对值

   void mod(T_O v, T1_I v1, Ts1_I s) 求余

   void mod(T1_O v, Ts1_I s) 求余

   void real(T_O v, T1_I v1) 提取实部

   void imag(T_O v, T1_I v1) 提取虚部

   void abs(T_IO v) 求绝对值

   void abs(T_O v, T1_I v1) 求绝对值

   Tret sum(T_I v) 求和

   Tret prod(T_I v) 求积

   Tr norm2(T_I v) 绝对值平方和

   Tr norm(T_I a) 绝对值平方和再开根号

   void resize_cpy(Tv_IO v, Long_I N, T_I val = 0) 矢量改变尺寸保留数据(多出数据初始化为 0)

   void resize_cpy(Tv_IO v, Long_I N0, Long_I N1, T_I val = 0) 矩阵改变尺寸保留数据(多出数据初始化为 0)

   void resize_cpy(Tv_IO v, Long_I N0, Long_I N1, Long_I N2, T_I val = 0) 3D 改变尺寸保留数据(多出数据初始化为 0)

   void linspace(Tv_O v, Ts_I first, Ts_I last) 等间距赋值

   void flip(Tv_IO v) 矢量翻转

   void flip(T_O v, T1_I v1) 矢量翻转

   void reorder(Tv_O v, To_I order) 矢量重新排序

   void trans(T_IO v) 方矩阵转置

   void trans(T_O v, T1_I v1) 矩阵转置

   void conj(T_IO v) 共轭

   void conj(T_O v, T1_I v1) 共轭

   void her(T_IO v) 厄米共轭

   void her(T_O v, T1_I v1) 厄米共轭

   void operator+=(T_IO v, Ts_I s)void operator-=(T_IO v, Ts_I s)void operator*=(T_IO v, Ts_I s)void operator/=(T_IO v, Ts_I s) 矩阵和标量的四则运算

   void operator+=(T_O &v, T1_I v1)void operator+=(T_O &v, T1_I v1)void operator-=(T_O &v, T1_I v1)void operator*=(T_O &v, T1_I v1)void operator/=(T_O &v, T1_I v1) 矩阵和矩阵的四则运算

   void plus(T_O v, T1_I v1, Ts2_I s)void minus(T_O v, T1_I v1, Ts2_I s)void times(T_O v, T1_I v1, Ts2_I s)void divide(T_O v, T1_I v1, Ts2_I s) 矩阵和标量的四则运算

   void pow(T_IO v, Ts_I s) 幂运算

   void pow(T_O v, T1_I v1, Ts_I s) 幂运算

   T dot(T1_I v1, T2_I v2) 点乘(内积)

   void cumsum(T_O v, T1_I v1) 累积求和

   void mul(T_O y, T1_I a, T2_I x) 矩阵乘矢量

   void mul(T_IO y, T1_I a, T2_I x, Ts1_I alpha, Ts_I beta) 矩阵乘矢量(慢)

   void mul(T_O &y, T1_I x, T2_I a) 行矢量乘矩阵(慢)

   void mul_gen(Ty_O y, Ta_I a, Tx_I &x) 一般矩阵乘矢量(使用 BLAS)

   void mul_gen(Ty_O &y, Ta_I a, Tx_I x, Tsa_I alpha = 1, Tsa_I beta = 0) 一般矩阵乘矢量(使用 BLAS)

   void mul_sym(Ty_IO &y, Ta_I a, Tx_I x, Tsa_I alpha = 1, Tsa_I beta = 0) 对称矩阵乘矢量(使用 BLAS)

   void uniq_elm(T_IO v) 找出不相同的元素(自动 resize)

   void uniq_rows(T_O a, T1_I a1) 找出不相同的行

   void exp(T_IO v) 指数函数

   void exp(T_O v, T1_I v1) 指数函数

                     

© 小时科技 保留一切权利