|
LMMC
Lamina Mathematic core
|
稠密矩阵 / 向量存储管理实现(创建、包装、销毁、填充、拷贝)。 更多...
#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_create (size_t rows, size_t cols, lmmc_mat_t *out_mat) |
创建 rows x cols 的零矩阵。 | |
| lmmc_status_t | lmmc_mat_wrap (size_t rows, size_t cols, size_t stride, lmmc_real_t *data, lmmc_mat_t *out_mat) |
| 创建引用调用方连续缓冲区的矩阵视图。 | |
| void | lmmc_mat_destroy (lmmc_mat_t *mat) |
| 销毁矩阵,释放其拥有的缓冲区并清零结构体字段。 | |
| lmmc_status_t | lmmc_mat_fill (lmmc_mat_t *mat, lmmc_real_t value) |
就地将矩阵所有元素设为 value。 | |
| lmmc_status_t | lmmc_mat_copy (const lmmc_mat_t *src, lmmc_mat_t *dst) |
| 逐元素复制矩阵内容:dst = src。 | |
| lmmc_status_t | lmmc_mat_transpose_to (const lmmc_mat_t *src, lmmc_mat_t *dst) |
| 计算矩阵转置:dst = src^T。 | |
| lmmc_status_t | lmmc_vec_create (size_t size, lmmc_vec_t *out_vec) |
创建长度为 size 的零向量。 | |
| lmmc_status_t | lmmc_vec_wrap (size_t size, lmmc_real_t *data, lmmc_vec_t *out_vec) |
| 创建引用调用方连续缓冲区的向量视图。 | |
| void | lmmc_vec_destroy (lmmc_vec_t *vec) |
| 销毁向量,释放其拥有的缓冲区并清零字段。 | |
| lmmc_status_t | lmmc_vec_fill (lmmc_vec_t *vec, lmmc_real_t value) |
就地将向量所有元素设为 value。 | |
| lmmc_status_t | lmmc_vec_copy (const lmmc_vec_t *src, lmmc_vec_t *dst) |
| 逐元素复制向量内容:dst = src。 | |
| lmmc_status_t | lmmc_vec_swap (lmmc_vec_t *x, lmmc_vec_t *y) |
| 就地交换两个等长向量的全部元素。 | |
稠密矩阵 / 向量存储管理实现(创建、包装、销毁、填充、拷贝)。
在文件 dense_storage.c 中定义.
| lmmc_status_t lmmc_mat_create | ( | size_t | rows, |
| size_t | cols, | ||
| lmmc_mat_t * | out_mat ) |
创建 rows x cols 的零矩阵。
用 lmmc_alloc 分配 rows*cols 个 lmmc_real_t 的连续缓冲区, stride=cols,owns_data=1。
| [in] | rows | 行数,须 > 0。 |
| [in] | cols | 列数,须 > 0。 |
| [out] | out_mat | 调用方提供的矩阵结构体,全部字段被覆写。 |
在文件 dense_storage.c 第 14 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_create(), lmmc_memory_alloc(), LMMC_REAL_INIT, LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::owns_data, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_eigen_symmetric(), lmmc_mat_create(), lmmc_mat_identity(), lmmc_mat_inv(), lmmc_mat_rdiv(), lmmc_pinv(), lmmc_std_linalg_inv(), lmmc_std_linalg_mat_add(), lmmc_std_linalg_mat_div(), lmmc_std_linalg_mat_div_scalar(), lmmc_std_linalg_mat_mul_elem(), lmmc_std_linalg_mat_pow_elem(), lmmc_std_linalg_mat_pow_scalar(), lmmc_std_linalg_mat_sub(), lmmc_std_linalg_matmul(), lmmc_std_linalg_scalar_div_mat(), lmmc_std_linalg_scalar_sub_mat(), lmmc_std_linalg_solve_left(), lmmc_std_linalg_transpose() , 以及 lmmc_svd_bidiagonalize().
| lmmc_status_t lmmc_mat_wrap | ( | size_t | rows, |
| size_t | cols, | ||
| size_t | stride, | ||
| lmmc_real_t * | data, | ||
| lmmc_mat_t * | out_mat ) |
创建引用调用方连续缓冲区的矩阵视图。
所有权保留给调用方,data 的生命周期须覆盖视图使用期。 lmmc_mat_destroy 仅销毁视图,写入视图会直接修改 data。
| [in] | rows | 行数,须 > 0。 |
| [in] | cols | 列数,须 > 0。 |
| [in] | stride | 相邻行首元素间距,须 >= cols。 |
| [in] | data | 非 NULL 的外部缓冲区,至少容纳 rows*stride 个 lmmc_real_t。 |
| [out] | out_mat | 输出矩阵视图,全部字段被覆写。 |
在文件 dense_storage.c 第 45 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_wrap(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::owns_data, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_wrap().
| void lmmc_mat_destroy | ( | lmmc_mat_t * | mat | ) |
销毁矩阵,释放其拥有的缓冲区并清零结构体字段。
owns_data 非零时用 lmmc_free 释放 data;外部缓冲区保留。 销毁后 data 为 NULL,rows、cols、stride 为零;重新 create/wrap 后可用于运算。
| [in,out] | mat | 待销毁矩阵,接受 NULL 或已销毁(data==NULL)的矩阵。 |
在文件 dense_storage.c 第 62 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_destroy(), lmmc_memory_free(), LMMC_REAL_CLEAR, lmmc_mat_t::owns_data, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_eigen_gen_full_result_destroy(), lmmc_eigen_sym_result_destroy(), lmmc_eigen_symmetric(), lmmc_mat_destroy(), lmmc_mat_inv(), lmmc_mat_pow(), lmmc_mat_rdiv(), lmmc_pinv(), lmmc_std_eig_table_destroy(), lmmc_std_linalg_diag(), lmmc_std_linalg_eye(), lmmc_std_linalg_inv(), lmmc_std_linalg_mat_add(), lmmc_std_linalg_mat_add_scalar(), lmmc_std_linalg_mat_div(), lmmc_std_linalg_mat_div_scalar(), lmmc_std_linalg_mat_mul_elem(), lmmc_std_linalg_mat_pow_elem(), lmmc_std_linalg_mat_pow_int(), lmmc_std_linalg_mat_pow_scalar(), lmmc_std_linalg_mat_scale(), lmmc_std_linalg_mat_sub(), lmmc_std_linalg_matmul(), lmmc_std_linalg_scalar_div_mat(), lmmc_std_linalg_scalar_sub_mat(), lmmc_std_linalg_solve_left(), lmmc_std_linalg_solve_right(), lmmc_std_linalg_transpose(), lmmc_std_svd_table_destroy(), lmmc_svd_bidiagonalize() , 以及 lmmc_svd_result_destroy().
| lmmc_status_t lmmc_mat_fill | ( | lmmc_mat_t * | mat, |
| lmmc_real_t | value ) |
就地将矩阵所有元素设为 value。
| [in,out] | mat | 已创建且 data 非 NULL 的矩阵。 |
| [in] | value | 填充值。 |
在文件 dense_storage.c 第 79 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_fill(), LMMC_REAL_SET, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_fill(), lmmc_sparse_bsr_to_dense(), lmmc_sparse_mat_mat_mul_dense() , 以及 lmmc_sparse_to_dense().
| lmmc_status_t lmmc_mat_copy | ( | const lmmc_mat_t * | src, |
| lmmc_mat_t * | dst ) |
逐元素复制矩阵内容:dst = src。
| [in] | src | 源矩阵,保持不变。 |
| [out] | dst | 已通过 create/wrap 初始化的目标矩阵,行列数须与 src 相同, stride 可不同,全部元素被覆写。 |
在文件 dense_storage.c 第 93 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_copy(), LMMC_REAL_SET, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_copy(), lmmc_mat_inv(), lmmc_mat_pow() , 以及 lmmc_std_linalg_solve_left().
| lmmc_status_t lmmc_mat_transpose_to | ( | const lmmc_mat_t * | src, |
| lmmc_mat_t * | dst ) |
计算矩阵转置:dst = src^T。
src 与 dst 的半开存储包络须互不重叠。
| [in] | src | 源矩阵(mxn),保持不变。 |
| [out] | dst | 已创建为 (src->cols x src->rows) 的目标矩阵,内容被覆写。 |
在文件 dense_storage.c 第 111 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_t::data, lmmc_mat_transpose_to(), LMMC_REAL_SET, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_mat_t::stride.
被这些函数引用 lmmc_mat_rdiv(), lmmc_mat_transpose_to() , 以及 lmmc_std_linalg_transpose().
| lmmc_status_t lmmc_vec_create | ( | size_t | size, |
| lmmc_vec_t * | out_vec ) |
创建长度为 size 的零向量。
| [in] | size | 元素个数,须 > 0。 |
| [out] | out_vec | 输出向量,全部字段被覆写,owns_data=1。 |
在文件 dense_storage.c 第 144 行定义.
引用了 lmmc_vec_t::data, lmmc_memory_alloc(), LMMC_REAL_INIT, LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_create(), lmmc_vec_t::owns_data , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_eigen_general(), lmmc_eigen_symmetric(), lmmc_sparse_diag(), lmmc_std_linalg_cross(), lmmc_std_linalg_matvec(), lmmc_std_linalg_scalar_div_vec(), lmmc_std_linalg_scalar_sub_vec(), lmmc_std_linalg_shape_vec(), lmmc_std_linalg_solve_left(), lmmc_std_linalg_vec_div(), lmmc_std_linalg_vec_div_scalar(), lmmc_std_linalg_vec_mul(), lmmc_std_linalg_vec_pow(), lmmc_std_linalg_vec_pow_scalar() , 以及 lmmc_vec_create().
| lmmc_status_t lmmc_vec_wrap | ( | size_t | size, |
| lmmc_real_t * | data, | ||
| lmmc_vec_t * | out_vec ) |
创建引用调用方连续缓冲区的向量视图。
所有权保留给调用方,data 的生命周期须覆盖视图使用期。 lmmc_vec_destroy 仅销毁视图,写入视图会直接修改 data。
| [in] | size | 元素个数,须 > 0。 |
| [in] | data | 非 NULL 的外部缓冲区,至少容纳 size 个 lmmc_real_t。 |
| [out] | out_vec | 输出向量视图。 |
在文件 dense_storage.c 第 169 行定义.
引用了 lmmc_vec_t::data, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_wrap(), lmmc_vec_t::owns_data , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_vec_wrap().
| void lmmc_vec_destroy | ( | lmmc_vec_t * | vec | ) |
销毁向量,释放其拥有的缓冲区并清零字段。
owns_data 非零时释放 data;外部缓冲区保留。 销毁后 data 为 NULL,size 为零,vec 须重新初始化后用于运算。
| [in,out] | vec | 待销毁向量,接受 NULL。 |
在文件 dense_storage.c 第 184 行定义.
引用了 lmmc_vec_t::data, lmmc_memory_free(), LMMC_REAL_CLEAR, lmmc_vec_destroy(), lmmc_vec_t::owns_data , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_eigen_gen_full_result_destroy(), lmmc_eigen_gen_result_destroy(), lmmc_eigen_general(), lmmc_eigen_sym_result_destroy(), lmmc_eigen_symmetric(), lmmc_sparse_diag(), lmmc_std_linalg_cross(), lmmc_std_linalg_matvec(), lmmc_std_linalg_scalar_div_vec(), lmmc_std_linalg_scalar_sub_vec(), lmmc_std_linalg_solve_left(), lmmc_std_linalg_vec_add(), lmmc_std_linalg_vec_add_scalar(), lmmc_std_linalg_vec_div(), lmmc_std_linalg_vec_div_scalar(), lmmc_std_linalg_vec_mul(), lmmc_std_linalg_vec_pow(), lmmc_std_linalg_vec_pow_scalar(), lmmc_std_linalg_vec_scale(), lmmc_std_linalg_vec_sub(), lmmc_svd_result_destroy() , 以及 lmmc_vec_destroy().
| lmmc_status_t lmmc_vec_fill | ( | lmmc_vec_t * | vec, |
| lmmc_real_t | value ) |
就地将向量所有元素设为 value。
| [in,out] | vec | 已创建的向量。 |
| [in] | value | 填充值。 |
在文件 dense_storage.c 第 199 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_SET, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_fill() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_sparse_diag(), lmmc_sparse_mat_vec_mul() , 以及 lmmc_vec_fill().
| lmmc_status_t lmmc_vec_copy | ( | const lmmc_vec_t * | src, |
| lmmc_vec_t * | dst ) |
逐元素复制向量内容:dst = src。
| [in] | src | 源向量,保持不变。 |
| [out] | dst | 与 src 等长的目标向量,全部元素被覆写。 |
在文件 dense_storage.c 第 210 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_SET, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_copy() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_apply_precond_or_identity(), lmmc_precond_apply() , 以及 lmmc_vec_copy().
| lmmc_status_t lmmc_vec_swap | ( | lmmc_vec_t * | x, |
| lmmc_vec_t * | y ) |
就地交换两个等长向量的全部元素。
| [in,out] | x | 第一个向量。 |
| [in,out] | y | 与 x 等长的第二个向量。 |
在文件 dense_storage.c 第 225 行定义.
引用了 lmmc_vec_t::data, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_swap() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_vec_swap().