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) 指数函数


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利