LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
dense_arithmetic.c 文件参考

稠密矩阵 / 向量算术与范数实现(加、减、缩放、范数、迹等)。 更多...

#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"
dense_arithmetic.c 的引用(Include)关系图:

浏览该文件的源代码.

函数

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_mat_norm_fro()

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_vec_norm2()

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_vec_norm_inf()

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_vec_scale()

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_vec_asum()

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_vec_iamax()

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_mat_add()

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_mat_sub()

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输出矩阵,内容被覆写。
返回
同 ::lmmc_mat_add。
注解
不分配内存。

在文件 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_mat_scale()

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_mat_identity()

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。
返回
注解
通过 lmmc_mat_create 分配内存,调用方须用 lmmc_mat_destroy 释放。

在文件 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_mat_trace()

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_mat_norm1()

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_mat_norm_inf()

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().

函数调用图:
这是这个函数的调用关系图: