17 if (!lmmc_mat_descriptor_is_valid(a) || out_norm == NULL) {
21 lmmc_scaled_sumsq_init(&acc);
22 for (
size_t i = 0; i < a->
rows; ++i) {
23 for (
size_t j = 0; j < a->
cols; ++j) {
24 lmmc_scaled_sumsq_add(
28 *out_norm = lmmc_scaled_sumsq_norm(&acc);
35 if (!lmmc_vec_descriptor_is_valid(x) || out_norm == NULL) {
39 lmmc_scaled_sumsq_init(&acc);
40 for (
size_t i = 0; i < x->
size; ++i) {
41 lmmc_scaled_sumsq_add(&acc, x->
data[i]);
43 *out_norm = lmmc_scaled_sumsq_norm(&acc);
48 if (!lmmc_vec_descriptor_is_valid(x) || out_norm == NULL) {
56 for (
size_t i = 0; i < x->
size; ++i) {
58 max_val = lmmc_max(max_val, abs_val);
68 if (!lmmc_vec_descriptor_is_valid(x)) {
74 for (
size_t i = 0; i < x->
size; ++i) {
84 if (!lmmc_vec_descriptor_is_valid(x) || out_asum == NULL) {
93 for (
size_t i = 0; i < x->
size; ++i) {
107 if (!lmmc_vec_descriptor_is_valid(x) || out_idx == NULL) {
117 for (
size_t i = 1; i < x->
size; ++i) {
132 if (!lmmc_mat_descriptor_is_valid(a) ||
133 !lmmc_mat_descriptor_is_valid(b) ||
134 !lmmc_mat_descriptor_is_valid(c)) {
144 for (
size_t i = 0; i < a->
rows; ++i) {
145 for (
size_t j = 0; j < a->
cols; ++j) {
158 if (!lmmc_mat_descriptor_is_valid(a) ||
159 !lmmc_mat_descriptor_is_valid(b) ||
160 !lmmc_mat_descriptor_is_valid(c)) {
170 for (
size_t i = 0; i < a->
rows; ++i) {
171 for (
size_t j = 0; j < a->
cols; ++j) {
184 if (!lmmc_mat_descriptor_is_valid(a)) {
190 for (
size_t i = 0; i < a->
rows; ++i) {
191 for (
size_t j = 0; j < a->
cols; ++j) {
202 if (out_mat == NULL || n == 0) {
214 for (
size_t i = 0; i < n; ++i) {
223 if (!lmmc_mat_descriptor_is_valid(a) || out_trace == NULL) {
234 for (
size_t i = 0; i < a->
rows; ++i) {
252 if (!lmmc_mat_descriptor_is_valid(a) || out_norm == NULL) {
262 for (j = 0; j < a->
cols; ++j) {
264 for (i = 0; i < a->
rows; ++i) {
290 if (!lmmc_mat_descriptor_is_valid(a) || out_norm == NULL) {
300 for (i = 0; i < a->
rows; ++i) {
302 for (j = 0; j < a->
cols; ++j) {
LMMC binary real type and arithmetic spelling.
#define LMMC_REAL_CLEAR(x)
释放一个 lmmc_real_t 变量(POD 类型为空操作)。
#define LMMC_REAL_INIT(x)
初始化一个 lmmc_real_t 变量(POD 类型为空操作)。
#define LMMC_REAL_ADD(res, a, b)
计算 *res = *a + *b 。
#define LMMC_REAL_SUB(res, a, b)
计算 *res = *a - *b 。
double lmmc_real_t
Public and internal LMMC real type.
#define LMMC_REAL_SET(dst, src)
将一个 lmmc_real_t 赋值到另一个:*dst = *src 。
#define LMMC_REAL_MUL(res, a, b)
计算 *res = *a * *b 。
#define LMMC_REAL_ABS(res, a)
计算绝对值,*res = |*a| 。
#define LMMC_REAL_CMP(a, b)
比较 *a 与 *b ,返回 -1/0/1 。
#define LMMC_REAL_SET_D(dst, dbl)
将一个 double 字面量赋值到 lmmc_real_t 。
lmmc_status_t lmmc_mat_scale(lmmc_mat_t *a, lmmc_real_t alpha)
就地矩阵标量乘: 。
lmmc_status_t lmmc_vec_iamax(const lmmc_vec_t *x, size_t *out_idx)
返回绝对值最大元素的下标。
lmmc_status_t lmmc_mat_norm_fro(const lmmc_mat_t *a, lmmc_real_t *out_norm)
计算矩阵的 Frobenius 范数: 。
lmmc_status_t lmmc_vec_asum(const lmmc_vec_t *x, lmmc_real_t *out_asum)
计算向量元素绝对值之和(L1 范数): 。
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_add(const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *c)
同维矩阵逐元素加法:c = a + b。
lmmc_status_t lmmc_vec_scale(lmmc_vec_t *x, lmmc_real_t alpha)
就地向量缩放: 。
lmmc_status_t lmmc_mat_norm1(const lmmc_mat_t *a, lmmc_real_t *out_norm)
计算矩阵的 1-范数(最大绝对列和): 。
lmmc_status_t lmmc_mat_norm_inf(const lmmc_mat_t *a, lmmc_real_t *out_norm)
计算矩阵的无穷范数(最大绝对行和): 。
lmmc_status_t lmmc_vec_norm2(const lmmc_vec_t *x, lmmc_real_t *out_norm)
计算向量的欧几里得(L2)范数: 。 采用缩放平方和累加;最终结果超出 binary64 范围时可为无穷。
lmmc_status_t lmmc_vec_norm_inf(const lmmc_vec_t *x, lmmc_real_t *out_norm)
计算向量的无穷范数: 。
lmmc_status_t lmmc_mat_trace(const lmmc_mat_t *a, lmmc_real_t *out_trace)
计算方阵的迹: 。
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_identity(size_t n, lmmc_mat_t *out_mat)
创建 nxn 单位矩阵,对角线为 1,其余元素为 0。
稠密矩阵直接分解接口(LU、Cholesky、QR)。
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_DIMENSION_MISMATCH
@ LMMC_STATUS_INVALID_ARGUMENT