|
LMMC
Lamina Mathematic core
|
稠密矩阵 / 向量算术与范数实现(加、减、缩放、范数、迹等)。 更多...
#include <math.h>#include <string.h>#include "memory_bridge.h"#include "internal.h"#include "lmmc/config.h"#include "lmmc/dense.h"#include "lmmc/linear_algebra.h"函数 | |
| 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_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_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_identity (size_t n, lmmc_mat_t *out_mat) |
| 创建 nxn 单位矩阵,对角线为 1,其余元素为 0。 | |
| 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}|\)。 | |
稠密矩阵 / 向量算术与范数实现(加、减、缩放、范数、迹等)。
在文件 dense_arithmetic.c 中定义.
| 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_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_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_identity | ( | size_t | n, |
| lmmc_mat_t * | out_mat ) |
创建 nxn 单位矩阵,对角线为 1,其余元素为 0。
| [in] | n | 矩阵阶数,须 > 0。 |
| [out] | out_mat | 输出矩阵,owns_data=1。 |
在文件 dense_arithmetic.c 第 201 行定义.
引用了 lmmc_mat_t::data, lmmc_mat_create(), lmmc_mat_identity(), LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_identity(), lmmc_std_linalg_eye() , 以及 lmmc_std_linalg_mat_pow_int().
| 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().