14 status = lmmc_std_require_finite_vec(a);
16 status = lmmc_std_require_finite_vec(b);
19 status = lmmc_std_copy_vec(a, &result);
23 status = lmmc_std_require_finite_vec(&result);
40 if (!lmmc_std_real_is_finite(scalar)) {
43 status = lmmc_std_copy_vec(x, &result);
45 for (
size_t i = 0; i < result.
size; ++i) {
46 result.
data[i] += scalar;
48 status = lmmc_std_require_finite_vec(&result);
64 status = lmmc_std_require_finite_vec(a);
66 status = lmmc_std_require_finite_vec(b);
69 status = lmmc_std_copy_vec(a, &result);
73 status = lmmc_std_require_finite_vec(&result);
97 if (!lmmc_std_real_is_finite(scalar)) {
100 status = lmmc_std_require_finite_vec(x);
104 for (
size_t i = 0; i < result.
size; ++i) {
105 result.
data[i] = scalar - x->
data[i];
107 status = lmmc_std_require_finite_vec(&result);
123 status = lmmc_std_require_finite_vec(a);
125 status = lmmc_std_require_finite_vec(b);
130 for (
size_t i = 0; i < result.
size; ++i) {
133 status = lmmc_std_require_finite_vec(&result);
149 status = lmmc_std_require_finite_vec(a);
151 status = lmmc_std_require_finite_vec(b);
154 for (
size_t i = 0; i < b->
size; ++i) {
159 for (
size_t i = 0; i < result.
size; ++i) {
162 status = lmmc_std_require_finite_vec(&result);
180 status = lmmc_std_require_finite_vec(x);
184 for (
size_t i = 0; i < result.
size; ++i) {
185 result.
data[i] = x->
data[i] / scalar;
187 status = lmmc_std_require_finite_vec(&result);
203 if (!lmmc_std_real_is_finite(scalar)) {
206 status = lmmc_std_require_finite_vec(x);
208 for (
size_t i = 0; i < x->
size; ++i) {
213 for (
size_t i = 0; i < result.
size; ++i) {
214 result.
data[i] = scalar / x->
data[i];
216 status = lmmc_std_require_finite_vec(&result);
232 status = lmmc_std_require_finite_vec(base);
234 status = lmmc_std_require_finite_vec(exponent);
239 for (
size_t i = 0; i < result.
size; ++i) {
241 lmmc_std_pow_finite(base->
data[i], exponent->
data[i], &result.
data[i]);
247 status = lmmc_std_require_finite_vec(&result);
263 status = lmmc_std_require_finite_vec(base);
265 if (!lmmc_std_real_is_finite(exponent)) {
270 for (
size_t i = 0; i < result.
size; ++i) {
271 status = lmmc_std_pow_finite(base->
data[i], exponent, &result.
data[i]);
277 status = lmmc_std_require_finite_vec(&result);
294 status = lmmc_std_copy_vec(x, &result);
298 status = lmmc_std_require_finite_vec(&result);
322 status = lmmc_std_require_finite_mat(a);
324 status = lmmc_std_require_finite_mat(b);
333 status = lmmc_std_require_finite_mat(&result);
350 if (!lmmc_std_real_is_finite(scalar)) {
353 status = lmmc_std_copy_mat(a, &result);
355 for (
size_t i = 0; i < result.
rows; ++i) {
356 for (
size_t j = 0; j < result.
cols; ++j) {
360 status = lmmc_std_require_finite_mat(&result);
376 status = lmmc_std_require_finite_mat(a);
378 status = lmmc_std_require_finite_mat(b);
387 status = lmmc_std_require_finite_mat(&result);
411 if (!lmmc_std_real_is_finite(scalar)) {
414 status = lmmc_std_require_finite_mat(a);
418 for (
size_t i = 0; i < result.
rows; ++i) {
419 for (
size_t j = 0; j < result.
cols; ++j) {
424 status = lmmc_std_require_finite_mat(&result);
440 status = lmmc_std_require_finite_mat(a);
442 status = lmmc_std_require_finite_mat(b);
449 for (
size_t i = 0; i < result.
rows; ++i) {
450 for (
size_t j = 0; j < result.
cols; ++j) {
455 status = lmmc_std_require_finite_mat(&result);
471 status = lmmc_std_require_finite_mat(a);
473 status = lmmc_std_require_finite_mat(b);
478 for (
size_t i = 0; i < b->
rows; ++i) {
479 for (
size_t j = 0; j < b->
cols; ++j) {
487 for (
size_t i = 0; i < result.
rows; ++i) {
488 for (
size_t j = 0; j < result.
cols; ++j) {
494 status = lmmc_std_require_finite_mat(&result);
512 status = lmmc_std_require_finite_mat(a);
516 for (
size_t i = 0; i < result.
rows; ++i) {
517 for (
size_t j = 0; j < result.
cols; ++j) {
522 status = lmmc_std_require_finite_mat(&result);
538 if (!lmmc_std_real_is_finite(scalar)) {
541 status = lmmc_std_require_finite_mat(a);
543 for (
size_t i = 0; i < a->
rows; ++i) {
544 for (
size_t j = 0; j < a->
cols; ++j) {
552 for (
size_t i = 0; i < result.
rows; ++i) {
553 for (
size_t j = 0; j < result.
cols; ++j) {
555 result.
data[i * result.
stride + j] = scalar / denom;
558 status = lmmc_std_require_finite_mat(&result);
574 status = lmmc_std_require_finite_mat(base);
576 status = lmmc_std_require_finite_mat(exponent);
583 for (
size_t i = 0; i < result.
rows; ++i) {
584 for (
size_t j = 0; j < result.
cols; ++j) {
585 status = lmmc_std_pow_finite(base->
data[i * base->
stride + j],
594 status = lmmc_std_require_finite_mat(&result);
610 status = lmmc_std_require_finite_mat(base);
612 if (!lmmc_std_real_is_finite(exponent)) {
617 for (
size_t i = 0; i < result.
rows; ++i) {
618 for (
size_t j = 0; j < result.
cols; ++j) {
619 status = lmmc_std_pow_finite(base->
data[i * base->
stride + j],
628 status = lmmc_std_require_finite_mat(&result);
647 status = lmmc_std_require_finite_mat(&product);
667 status = lmmc_std_require_finite_mat(base);
675 power = (uint64_t)(-(exponent + 1)) + UINT64_C(1);
677 status = lmmc_std_copy_mat(base, &factor);
679 power = (uint64_t)exponent;
689 if ((power & UINT64_C(1)) != 0) {
690 status = lmmc_std_replace_with_product(&result, &factor);
700 status = lmmc_std_replace_with_product(&factor, &factor);
722 status = lmmc_std_copy_mat(a, &result);
726 status = lmmc_std_require_finite_mat(&result);
752 status = lmmc_std_require_finite_vec(a);
754 status = lmmc_std_require_finite_vec(b);
757 if (!lmmc_std_compare_eval(0, op, 0, &ignored)) {
760 status = lmmc_std_bool_vec_create(a->
size, &result);
762 for (
size_t i = 0; i < result.
size; ++i) {
763 (void)lmmc_std_compare_eval(a->
data[i], op, b->
data[i], &result.
data[i]);
778 status = lmmc_std_require_finite_vec(a);
780 if (!lmmc_std_real_is_finite(scalar)) {
783 if (!lmmc_std_compare_eval(0, op, 0, &ignored)) {
786 status = lmmc_std_bool_vec_create(a->
size, &result);
788 for (
size_t i = 0; i < result.
size; ++i) {
789 (void)lmmc_std_compare_eval(a->
data[i], op, scalar, &result.
data[i]);
804 status = lmmc_std_require_finite_mat(a);
806 status = lmmc_std_require_finite_mat(b);
811 if (!lmmc_std_compare_eval(0, op, 0, &ignored)) {
814 status = lmmc_std_bool_mat_create(a->
rows, a->
cols, &result);
816 for (
size_t i = 0; i < result.
rows; ++i) {
817 for (
size_t j = 0; j < result.
cols; ++j) {
818 (void)lmmc_std_compare_eval(a->
data[i * a->
stride + j],
836 status = lmmc_std_require_finite_mat(a);
838 if (!lmmc_std_real_is_finite(scalar)) {
841 if (!lmmc_std_compare_eval(0, op, 0, &ignored)) {
844 status = lmmc_std_bool_mat_create(a->
rows, a->
cols, &result);
846 for (
size_t i = 0; i < result.
rows; ++i) {
847 for (
size_t j = 0; j < result.
cols; ++j) {
848 (void)lmmc_std_compare_eval(a->
data[i * a->
stride + j],
double lmmc_real_t
Public and internal LMMC real type.
lmmc_status_t lmmc_mat_scale(lmmc_mat_t *a, lmmc_real_t alpha)
就地矩阵标量乘: 。
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_axpy(lmmc_real_t alpha, const lmmc_vec_t *x, lmmc_vec_t *y)
向量 AXPY 运算: 。
lmmc_status_t lmmc_vec_scale(lmmc_vec_t *x, lmmc_real_t alpha)
就地向量缩放: 。
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_mat_create(size_t rows, size_t cols, lmmc_mat_t *out_mat)
创建 rows x cols 的零矩阵。
lmmc_status_t lmmc_vec_create(size_t size, lmmc_vec_t *out_vec)
创建长度为 size 的零向量。
lmmc_status_t lmmc_mat_identity(size_t n, lmmc_mat_t *out_mat)
创建 nxn 单位矩阵,对角线为 1,其余元素为 0。
void lmmc_mat_destroy(lmmc_mat_t *mat)
销毁矩阵,释放其拥有的缓冲区并清零结构体字段。
void lmmc_vec_destroy(lmmc_vec_t *vec)
销毁向量,释放其拥有的缓冲区并清零字段。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_DIMENSION_MISMATCH
@ LMMC_STATUS_INVALID_ARGUMENT
lmmc_status_t lmmc_std_linalg_mat_add(const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_mat_sub_scalar(const lmmc_mat_t *a, lmmc_real_t scalar, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_mat_div_scalar(const lmmc_mat_t *a, lmmc_real_t scalar, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_mat_scale(const lmmc_mat_t *a, lmmc_real_t alpha, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_mat_compare_scalar(const lmmc_mat_t *a, lmmc_std_compare_op_t op, lmmc_real_t scalar, lmmc_std_bool_mat_t *out)
lmmc_status_t lmmc_std_linalg_mat_mul_scalar(const lmmc_mat_t *a, lmmc_real_t scalar, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_scalar_div_mat(lmmc_real_t scalar, const lmmc_mat_t *a, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_inv(const lmmc_mat_t *a, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_scalar_sub_vec(lmmc_real_t scalar, const lmmc_vec_t *x, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_mat_add_scalar(const lmmc_mat_t *a, lmmc_real_t scalar, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_scalar_div_vec(lmmc_real_t scalar, const lmmc_vec_t *x, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_vec_scale(const lmmc_vec_t *x, lmmc_real_t alpha, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_mat_compare(const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_std_compare_op_t op, lmmc_std_bool_mat_t *out)
lmmc_status_t lmmc_std_linalg_vec_pow_scalar(const lmmc_vec_t *base, lmmc_real_t exponent, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_vec_pow(const lmmc_vec_t *base, const lmmc_vec_t *exponent, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_mat_pow_int(const lmmc_mat_t *base, int64_t exponent, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_vec_sub(const lmmc_vec_t *a, const lmmc_vec_t *b, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_mat_pow_elem(const lmmc_mat_t *base, const lmmc_mat_t *exponent, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_vec_mul_scalar(const lmmc_vec_t *x, lmmc_real_t scalar, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_mat_mul_elem(const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_vec_div_scalar(const lmmc_vec_t *x, lmmc_real_t scalar, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_mat_div(const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_vec_sub_scalar(const lmmc_vec_t *x, lmmc_real_t scalar, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_vec_mul(const lmmc_vec_t *a, const lmmc_vec_t *b, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_scalar_sub_mat(lmmc_real_t scalar, const lmmc_mat_t *a, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_vec_compare(const lmmc_vec_t *a, const lmmc_vec_t *b, lmmc_std_compare_op_t op, lmmc_std_bool_vec_t *out)
lmmc_status_t lmmc_std_linalg_vec_div(const lmmc_vec_t *a, const lmmc_vec_t *b, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_vec_compare_scalar(const lmmc_vec_t *a, lmmc_std_compare_op_t op, lmmc_real_t scalar, lmmc_std_bool_vec_t *out)
lmmc_status_t lmmc_std_linalg_vec_add_scalar(const lmmc_vec_t *x, lmmc_real_t scalar, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_mat_sub(const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *out)
lmmc_status_t lmmc_std_linalg_vec_add(const lmmc_vec_t *a, const lmmc_vec_t *b, lmmc_vec_t *out)
lmmc_status_t lmmc_std_linalg_mat_pow_scalar(const lmmc_mat_t *base, lmmc_real_t exponent, lmmc_mat_t *out)