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

稠密矩阵 / 向量存储管理实现(创建、包装、销毁、填充、拷贝)。 更多...

#include <string.h>
#include "memory_bridge.h"
#include "internal.h"
#include "lmmc/config.h"
#include "lmmc/dense.h"
#include "lmmc/linear_algebra.h"
dense_storage.c 的引用(Include)关系图:

浏览该文件的源代码.

函数

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

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调用方提供的矩阵结构体,全部字段被覆写。
返回
注解
调用方须用 lmmc_mat_destroy 释放缓冲区。
函数无共享状态;lmmc_alloc 线程安全时支持并发调用。

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

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

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

◆ lmmc_mat_destroy()

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

lmmc_status_t lmmc_mat_fill ( lmmc_mat_t * mat,
lmmc_real_t value )

就地将矩阵所有元素设为 value。

参数
[in,out]mat已创建且 data 非 NULL 的矩阵。
[in]value填充值。
返回
注解
按 stride 写入 data[i*stride+j],无内存分配或释放。

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

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

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

lmmc_status_t lmmc_vec_create ( size_t size,
lmmc_vec_t * out_vec )

创建长度为 size 的零向量。

参数
[in]size元素个数,须 > 0。
[out]out_vec输出向量,全部字段被覆写,owns_data=1。
返回
注解
分配堆内存,调用方须用 lmmc_vec_destroy 释放。

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

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

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

◆ lmmc_vec_destroy()

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

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

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

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

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