|
LMMC
Lamina Mathematic core
|
函数 | |
| lmmc_status_t | lmmc_mat_gemm (lmmc_real_t alpha, const lmmc_mat_t *A, int transA, const lmmc_mat_t *B, int transB, lmmc_real_t beta, lmmc_mat_t *C) |
| 通用矩阵-矩阵乘法(GEMM): \(C \leftarrow \alpha \cdot \mathrm{op}(A) \cdot \mathrm{op}(B) + \beta \cdot C\)。 | |
| lmmc_status_t | lmmc_mat_gemv (lmmc_real_t alpha, const lmmc_mat_t *A, int transA, const lmmc_vec_t *x, lmmc_real_t beta, lmmc_vec_t *y) |
| 通用矩阵-向量乘法(GEMV): \(y \leftarrow \alpha \cdot \mathrm{op}(A) \cdot x + \beta \cdot y\)。 | |
| lmmc_status_t | lmmc_mat_mul (const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *c) |
| 计算矩阵乘积:c = a * b。 | |
| lmmc_status_t | lmmc_mat_norm_fro (const lmmc_mat_t *a, lmmc_real_t *out_norm) |
| 计算矩阵的 Frobenius 范数: \(\|A\|_F = \sqrt{\sum_{i,j} A_{ij}^2}\)。 | |
| lmmc_status_t | lmmc_vec_dot (const lmmc_vec_t *a, const lmmc_vec_t *b, lmmc_real_t *out_dot) |
| 计算两个等长向量的内积: \(\text{out\_dot} = \sum_i a_i \cdot b_i\)。 | |
| lmmc_status_t | lmmc_mat_vec_mul (const lmmc_mat_t *a, const lmmc_vec_t *x, lmmc_vec_t *y) |
| 计算矩阵与向量的乘积:y = A * x。 | |
| lmmc_status_t | lmmc_vec_norm2 (const lmmc_vec_t *x, lmmc_real_t *out_norm) |
| 计算向量的欧几里得(L2)范数: \(\|x\|_2 = \sqrt{\sum_i x_i^2}\)。 采用缩放平方和累加;最终结果超出 binary64 范围时可为无穷。 | |
| lmmc_status_t | lmmc_vec_norm_inf (const lmmc_vec_t *x, lmmc_real_t *out_norm) |
| 计算向量的无穷范数: \(\|x\|_\infty = \max_i |x_i|\)。 | |
| lmmc_status_t | lmmc_vec_scale (lmmc_vec_t *x, lmmc_real_t alpha) |
| 就地向量缩放: \(x \leftarrow \alpha \cdot x\)。 | |
| lmmc_status_t | lmmc_vec_axpy (lmmc_real_t alpha, const lmmc_vec_t *x, lmmc_vec_t *y) |
| 向量 AXPY 运算: \(y \leftarrow \alpha \cdot x + y\)。 | |
| lmmc_status_t | lmmc_vec_asum (const lmmc_vec_t *x, lmmc_real_t *out_asum) |
| 计算向量元素绝对值之和(L1 范数): \(\sum_i |x_i|\)。 | |
| lmmc_status_t | lmmc_vec_iamax (const lmmc_vec_t *x, size_t *out_idx) |
| 返回绝对值最大元素的下标。 | |
| lmmc_status_t | lmmc_mat_add (const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *c) |
| 同维矩阵逐元素加法:c = a + b。 | |
| lmmc_status_t | lmmc_mat_sub (const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *c) |
| 同维矩阵逐元素减法:c = a - b。 | |
| lmmc_status_t | lmmc_mat_scale (lmmc_mat_t *a, lmmc_real_t alpha) |
| 就地矩阵标量乘: \(A \leftarrow \alpha \cdot A\)。 | |
| lmmc_status_t | lmmc_mat_trace (const lmmc_mat_t *a, lmmc_real_t *out_trace) |
| 计算方阵的迹: \(\mathrm{tr}(A) = \sum_i A_{ii}\)。 | |
| lmmc_status_t | lmmc_mat_norm1 (const lmmc_mat_t *a, lmmc_real_t *out_norm) |
| 计算矩阵的 1-范数(最大绝对列和): \(\|A\|_1 = \max_j \sum_i |A_{ij}|\)。 | |
| lmmc_status_t | lmmc_mat_norm_inf (const lmmc_mat_t *a, lmmc_real_t *out_norm) |
| 计算矩阵的无穷范数(最大绝对行和): \(\|A\|_\infty = \max_i \sum_j |A_{ij}|\)。 | |
| lmmc_status_t | lmmc_vec_cross (const lmmc_vec_t *a, const lmmc_vec_t *b, lmmc_vec_t *c) |
| 计算三维向量叉积: \(c = a \times b\)。 | |
| lmmc_status_t lmmc_mat_gemm | ( | lmmc_real_t | alpha, |
| const lmmc_mat_t * | A, | ||
| int | transA, | ||
| const lmmc_mat_t * | B, | ||
| int | transB, | ||
| lmmc_real_t | beta, | ||
| lmmc_mat_t * | C ) |
通用矩阵-矩阵乘法(GEMM): \(C \leftarrow \alpha \cdot \mathrm{op}(A) \cdot \mathrm{op}(B) + \beta \cdot C\)。
op(X) = X(transX==0)或 X^T(transX!=0)。 设 op(A) 为 MxK,op(B) 为 KxN,则 C 必须为 MxN。 使用内置分块三重循环实现,块大小为 64。
| [in] | alpha | 标量乘子 alpha。 |
| [in] | A | 输入矩阵 A(不被修改)。 |
| [in] | transA | 非零表示对 A 取转置。 |
| [in] | B | 输入矩阵 B(不被修改)。 |
| [in] | transB | 非零表示对 B 取转置。 |
| [in] | beta | 标量乘子 beta.beta==0 时 C 的旧值被忽略(可含 NaN)。 |
| [in,out] | C | 输出矩阵,维度须为 MxN.C 不可与 A 或 B 别名。 |
在文件 dense_products.c 第 185 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_gemm(), LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK , 以及 lmmc_mat_t::rows.
被这些函数引用 lmmc_mat_gemm() , 以及 lmmc_mat_mul().
| lmmc_status_t lmmc_mat_gemv | ( | lmmc_real_t | alpha, |
| const lmmc_mat_t * | A, | ||
| int | transA, | ||
| const lmmc_vec_t * | x, | ||
| lmmc_real_t | beta, | ||
| lmmc_vec_t * | y ) |
通用矩阵-向量乘法(GEMV): \(y \leftarrow \alpha \cdot \mathrm{op}(A) \cdot x + \beta \cdot y\)。
op(A) 为 MxN 时,要求 x->size==N,y->size==M。 y 的半开存储包络不得与 A 或 x 的存储包络重叠。
| [in] | alpha | 标量乘子 alpha。 |
| [in] | A | 输入矩阵 A(不被修改)。 |
| [in] | transA | 非零表示对 A 取转置。 |
| [in] | x | 输入向量 x(不被修改)。 |
| [in] | beta | 标量乘子 beta.beta==0 时 y 的旧值被忽略。 |
| [in,out] | y | 输出向量,长度须为 op(A) 的行数,且不得与 A 或 x 重叠。 |
在文件 dense_products.c 第 256 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_gemv(), LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_mat_gemv() , 以及 lmmc_mat_vec_mul().
| lmmc_status_t lmmc_mat_mul | ( | const lmmc_mat_t * | a, |
| const lmmc_mat_t * | b, | ||
| lmmc_mat_t * | c ) |
计算矩阵乘积:c = a * b。
等价于 lmmc_mat_gemm(1.0, a, 0, b, 0, 0.0, c)。 a 为 mxk,b 为 kxn,c 必须已创建为 mxn.c 不可与 a 或 b 别名。
| [in] | a | 左矩阵(不被修改)。 |
| [in] | b | 右矩阵(不被修改)。 |
| [out] | c | 结果矩阵,旧内容被完全覆写。 |
在文件 dense_products.c 第 224 行定义.
引用了 lmmc_mat_gemm() , 以及 lmmc_mat_mul().
被这些函数引用 lmmc_mat_mul() , 以及 lmmc_std_linalg_matmul().
| lmmc_status_t lmmc_mat_norm_fro | ( | const lmmc_mat_t * | a, |
| lmmc_real_t * | out_norm ) |
计算矩阵的 Frobenius 范数: \(\|A\|_F = \sqrt{\sum_{i,j} A_{ij}^2}\)。
采用缩放平方和累加;最终结果超出 binary64 范围时可为无穷。
| [in] | a | 输入矩阵(不被修改)。 |
| [out] | out_norm | 输出范数值。 |
在文件 dense_arithmetic.c 第 14 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_norm_fro(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_norm_fro().
| lmmc_status_t lmmc_vec_dot | ( | const lmmc_vec_t * | a, |
| const lmmc_vec_t * | b, | ||
| lmmc_real_t * | out_dot ) |
计算两个等长向量的内积: \(\text{out\_dot} = \sum_i a_i \cdot b_i\)。
| [in] | a | 第一个向量(不被修改)。 |
| [in] | b | 第二个向量(不被修改),长度须与 a 相同。 |
| [out] | out_dot | 输出内积值。 |
在文件 dense_products.c 第 228 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_dot() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_std_linalg_dot(), lmmc_vec_dot() , 以及 lmmc_vec_dot_checked().
| lmmc_status_t lmmc_mat_vec_mul | ( | const lmmc_mat_t * | a, |
| const lmmc_vec_t * | x, | ||
| lmmc_vec_t * | y ) |
计算矩阵与向量的乘积:y = A * x。
等价于 lmmc_mat_gemv(1.0, a, 0, x, 0.0, y)。 a 为 mxn,x->size==n,y->size==m.y 的旧内容被完全覆写,且 y 不得与 a 或 x 重叠。
| [in] | a | 输入矩阵(不被修改)。 |
| [in] | x | 输入向量(不被修改)。 |
| [out] | y | 输出向量,旧内容被覆写。 |
在文件 dense_products.c 第 283 行定义.
引用了 lmmc_mat_gemv() , 以及 lmmc_mat_vec_mul().
被这些函数引用 lmmc_mat_vec_mul() , 以及 lmmc_std_linalg_matvec().
| lmmc_status_t lmmc_vec_norm2 | ( | const lmmc_vec_t * | x, |
| lmmc_real_t * | out_norm ) |
计算向量的欧几里得(L2)范数: \(\|x\|_2 = \sqrt{\sum_i x_i^2}\)。 采用缩放平方和累加;最终结果超出 binary64 范围时可为无穷。
| [in] | x | 输入向量(不被修改),size 必须 > 0。 |
| [out] | out_norm | 输出范数值(非负)。 |
在文件 dense_arithmetic.c 第 32 行定义.
引用了 lmmc_vec_t::data, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_norm2() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_std_linalg_norm(), lmmc_vec_norm2() , 以及 lmmc_vec_norm2_checked().
| lmmc_status_t lmmc_vec_norm_inf | ( | const lmmc_vec_t * | x, |
| lmmc_real_t * | out_norm ) |
计算向量的无穷范数: \(\|x\|_\infty = \max_i |x_i|\)。
| [in] | x | 输入向量(不被修改),size 必须 > 0。 |
| [out] | out_norm | 输出范数值(非负)。 |
在文件 dense_arithmetic.c 第 47 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_ABS, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_norm_inf() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_vec_norm_inf().
| lmmc_status_t lmmc_vec_scale | ( | lmmc_vec_t * | x, |
| lmmc_real_t | alpha ) |
就地向量缩放: \(x \leftarrow \alpha \cdot x\)。
| [in,out] | x | 待缩放向量,size 必须 > 0。 |
| [in] | alpha | 缩放因子。 |
在文件 dense_arithmetic.c 第 67 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_scale() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_std_linalg_vec_scale() , 以及 lmmc_vec_scale().
| lmmc_status_t lmmc_vec_axpy | ( | lmmc_real_t | alpha, |
| const lmmc_vec_t * | x, | ||
| lmmc_vec_t * | y ) |
向量 AXPY 运算: \(y \leftarrow \alpha \cdot x + y\)。
x 与 y 长度须相同。
| [in] | alpha | 缩放因子。 |
| [in] | x | 输入向量(不被修改)。 |
| [in,out] | y | 累加目标向量,就地修改。 |
在文件 dense_products.c 第 287 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_axpy() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_gmres_arnoldi(), lmmc_std_linalg_vec_add(), lmmc_std_linalg_vec_sub() , 以及 lmmc_vec_axpy().
| lmmc_status_t lmmc_vec_asum | ( | const lmmc_vec_t * | x, |
| lmmc_real_t * | out_asum ) |
计算向量元素绝对值之和(L1 范数): \(\sum_i |x_i|\)。
| [in] | x | 输入向量(不被修改),size 必须 > 0。 |
| [out] | out_asum | 输出绝对值和(非负)。 |
在文件 dense_arithmetic.c 第 83 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_ABS, LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_asum() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_vec_asum().
| lmmc_status_t lmmc_vec_iamax | ( | const lmmc_vec_t * | x, |
| size_t * | out_idx ) |
返回绝对值最大元素的下标。
若有多个相同最大值,返回最小下标。
| [in] | x | 输入向量(不被修改),size 必须 > 0。 |
| [out] | out_idx | 输出下标(从 0 开始)。 |
在文件 dense_arithmetic.c 第 106 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_ABS, LMMC_REAL_CLEAR, LMMC_REAL_CMP, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_iamax() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_vec_iamax().
| lmmc_status_t lmmc_mat_add | ( | const lmmc_mat_t * | a, |
| const lmmc_mat_t * | b, | ||
| lmmc_mat_t * | c ) |
同维矩阵逐元素加法:c = a + b。
a,b,c 维度须完全相同.c 可与 a 或 b 别名(就地加法)。
| [in] | a | 输入矩阵(不被修改)。 |
| [in] | b | 输入矩阵(不被修改)。 |
| [out] | c | 输出矩阵,内容被覆写。 |
在文件 dense_arithmetic.c 第 131 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_add(), LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_add() , 以及 lmmc_std_linalg_mat_add().
| lmmc_status_t lmmc_mat_sub | ( | const lmmc_mat_t * | a, |
| const lmmc_mat_t * | b, | ||
| lmmc_mat_t * | c ) |
同维矩阵逐元素减法:c = a - b。
a,b,c 维度须完全相同.c 可与 a 或 b 别名。
| [in] | a | 输入矩阵(不被修改)。 |
| [in] | b | 输入矩阵(不被修改)。 |
| [out] | c | 输出矩阵,内容被覆写。 |
在文件 dense_arithmetic.c 第 157 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_sub(), LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_REAL_SUB, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_sub() , 以及 lmmc_std_linalg_mat_sub().
| lmmc_status_t lmmc_mat_scale | ( | lmmc_mat_t * | a, |
| lmmc_real_t | alpha ) |
就地矩阵标量乘: \(A \leftarrow \alpha \cdot A\)。
| [in,out] | a | 待缩放矩阵。 |
| [in] | alpha | 缩放因子。 |
在文件 dense_arithmetic.c 第 183 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_scale(), LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_scale() , 以及 lmmc_std_linalg_mat_scale().
| lmmc_status_t lmmc_mat_trace | ( | const lmmc_mat_t * | a, |
| lmmc_real_t * | out_trace ) |
计算方阵的迹: \(\mathrm{tr}(A) = \sum_i A_{ii}\)。
要求 a->rows == a->cols。
| [in] | a | 输入方阵(不被修改)。 |
| [out] | out_trace | 输出迹值。 |
在文件 dense_arithmetic.c 第 222 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_trace(), LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_trace() , 以及 lmmc_std_linalg_trace().
| lmmc_status_t lmmc_mat_norm1 | ( | const lmmc_mat_t * | a, |
| lmmc_real_t * | out_norm ) |
计算矩阵的 1-范数(最大绝对列和): \(\|A\|_1 = \max_j \sum_i |A_{ij}|\)。
无临时内存分配。
| [in] | a | 输入矩阵(不被修改)。 |
| [out] | out_norm | 输出范数值。 |
在文件 dense_arithmetic.c 第 245 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_norm1(), LMMC_REAL_ABS, LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_CMP, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_norm1().
| lmmc_status_t lmmc_mat_norm_inf | ( | const lmmc_mat_t * | a, |
| lmmc_real_t * | out_norm ) |
计算矩阵的无穷范数(最大绝对行和): \(\|A\|_\infty = \max_i \sum_j |A_{ij}|\)。
无临时内存分配。
| [in] | a | 输入矩阵(不被修改)。 |
| [out] | out_norm | 输出范数值。 |
在文件 dense_arithmetic.c 第 283 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_norm_inf(), LMMC_REAL_ABS, LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_CMP, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_norm_inf().
| lmmc_status_t lmmc_vec_cross | ( | const lmmc_vec_t * | a, |
| const lmmc_vec_t * | b, | ||
| lmmc_vec_t * | c ) |
计算三维向量叉积: \(c = a \times b\)。
公式:
支持别名(c 可与 a 或 b 为同一向量),内部使用临时变量计算。
| [in] | a | 输入向量(不被修改),长度必须为 3。 |
| [in] | b | 输入向量(不被修改),长度必须为 3。 |
| [out] | c | 输出向量,长度必须为 3,内容被覆写。 |
在文件 dense_elementwise.c 第 286 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_REAL_SUB, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_cross() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_vec_cross().