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

稠密矩阵乘法与向量内积实现(GEMM / GEMV / dot / axpy)。 更多...

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

浏览该文件的源代码.

函数

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_mul (const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *c)
 计算矩阵乘积:c = a * b。
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_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_vec_mul (const lmmc_mat_t *a, const lmmc_vec_t *x, lmmc_vec_t *y)
 计算矩阵与向量的乘积:y = A * 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\)。

详细描述

稠密矩阵乘法与向量内积实现(GEMM / GEMV / dot / axpy)。

在文件 dense_products.c 中定义.

函数说明

◆ lmmc_mat_gemm()

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_mat_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结果矩阵,旧内容被完全覆写。
返回
同 ::lmmc_mat_gemm。
注解
不分配内存。

在文件 dense_products.c 第 224 行定义.

引用了 lmmc_mat_gemm() , 以及 lmmc_mat_mul().

被这些函数引用 lmmc_mat_mul() , 以及 lmmc_std_linalg_matmul().

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

◆ lmmc_vec_dot()

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

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

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输出向量,旧内容被覆写。
返回
同 ::lmmc_mat_gemv。
注解
不分配内存。

在文件 dense_products.c 第 283 行定义.

引用了 lmmc_mat_gemv() , 以及 lmmc_mat_vec_mul().

被这些函数引用 lmmc_mat_vec_mul() , 以及 lmmc_std_linalg_matvec().

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

◆ lmmc_vec_axpy()

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

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