LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
eigen_general_vectors.c
浏览该文件的文档.
1#include <math.h>
2#include <string.h>
3#include "memory_bridge.h"
4#include "internal.h"
5#include "eigen_internal.h"
6#include "lmmc/config.h"
7#include "lmmc/dense.h"
8#include "lmmc/eigen.h"
11
13
15 if (!result) {
16 return;
17 }
22}
23
24static lmmc_status_t create_full_result(size_t n, lmmc_eigen_gen_full_result_t* result)
25{
26 memset(result, 0, sizeof(*result));
27 lmmc_status_t status = lmmc_vec_create(n, &result->real_parts);
28 if (status != LMMC_STATUS_OK) {
29 return status;
30 }
31 status = lmmc_vec_create(n, &result->imag_parts);
32 if (status != LMMC_STATUS_OK) {
33 return status;
34 }
35 status = lmmc_mat_create(n, n, &result->vectors_real);
36 if (status != LMMC_STATUS_OK) {
37 return status;
38 }
39 return lmmc_mat_create(n, n, &result->vectors_imag);
40}
41
42static lmmc_status_t eigenvectors_large(const lmmc_mat_t* a, lmmc_real_t matrix_scale,
44{
45 size_t n = a->rows;
46 lmmc_mat_t scaled_a = {0};
47 lmmc_eigen_gen_result_t eigenvalues = {0};
48 lmmc_status_t status = lmmc_mat_create(n, n, &scaled_a);
49 if (status != LMMC_STATUS_OK) {
50 return status;
51 }
52 lmmc_eigen_copy_scaled(a, matrix_scale, &scaled_a);
53 status = lmmc_eigen_general(&scaled_a, &eigenvalues);
54 if (status != LMMC_STATUS_OK) {
55 goto cleanup;
56 }
57 for (size_t i = 0; i < n; ++i) {
58 out_result->real_parts.data[i] = eigenvalues.real_parts.data[i];
59 out_result->imag_parts.data[i] = eigenvalues.imag_parts.data[i];
60 }
62 for (size_t i = 0; i < n; i++) {
63 for (size_t j = 0; j < n; j++) {
64 MAT_ELEM(&out_result->vectors_imag, i, j) = 0.0;
65 }
66 }
67 status = lmmc_eigen_inverse_vectors(&scaled_a, out_result);
68 if (status == LMMC_STATUS_OK) {
69 status = lmmc_eigen_restore_scale(&out_result->real_parts,
70 &out_result->imag_parts, matrix_scale);
71 }
72cleanup:
73 lmmc_mat_destroy(&scaled_a);
74 return status;
75}
76
79{
80 lmmc_real_t matrix_scale;
81 if (!lmmc_mat_descriptor_is_valid(a) || !out_result) {
83 }
84 if (a->rows != a->cols) {
86 }
87 lmmc_status_t status = lmmc_eigen_matrix_scale(a, &matrix_scale);
88 if (status != LMMC_STATUS_OK) {
89 return status;
90 }
91 size_t n = a->rows;
92 status = create_full_result(n, out_result);
93 if (status != LMMC_STATUS_OK) {
94 goto fail;
95 }
96 if (n == 1) {
97 out_result->real_parts.data[0] = MAT_ELEM(a, 0, 0);
98 out_result->imag_parts.data[0] = 0.0;
99 MAT_ELEM(&out_result->vectors_real, 0, 0) = 1.0;
100 MAT_ELEM(&out_result->vectors_imag, 0, 0) = 0.0;
101 return LMMC_STATUS_OK;
102 }
103if (n == 2) {
104 lmmc_eigen_vectors_2x2(a, matrix_scale, out_result);
105 return LMMC_STATUS_OK;
106 }
107 status = eigenvectors_large(a, matrix_scale, out_result);
108 if (status == LMMC_STATUS_OK) {
109 return status;
110 }
111fail:
113 memset(out_result, 0, sizeof(*out_result));
114 return status;
115}
LMMC binary real type and arithmetic spelling.
double lmmc_real_t
Public and internal LMMC real type.
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 的零向量。
void lmmc_mat_destroy(lmmc_mat_t *mat)
销毁矩阵,释放其拥有的缓冲区并清零结构体字段。
void lmmc_vec_destroy(lmmc_vec_t *vec)
销毁向量,释放其拥有的缓冲区并清零字段。
lmmc_real_t * data
行优先存储的稠密矩阵。
特征值 / 奇异值分解,伪逆与条件数接口.
lmmc_status_t lmmc_eigen_general(const lmmc_mat_t *a, lmmc_eigen_gen_result_t *out_result)
计算一般实矩阵的特征值(不输出特征向量).
lmmc_status_t lmmc_eigen_general_full(const lmmc_mat_t *a, lmmc_eigen_gen_full_result_t *out_result)
计算一般实矩阵的特征值与特征向量.
void lmmc_eigen_gen_result_destroy(lmmc_eigen_gen_result_t *result)
释放 lmmc_eigen_general 输出结果.
void lmmc_eigen_gen_full_result_destroy(lmmc_eigen_gen_full_result_t *result)
释放 lmmc_eigen_general_full 输出结果.
一般实矩阵完整特征分解结果(特征值 + 特征向量).
定义 eigen.h:42
一般实矩阵特征分解结果(仅特征值,使用实部 / 虚部分别存储).
定义 eigen.h:28
lmmc_status_t lmmc_eigen_restore_scale(lmmc_vec_t *real, lmmc_vec_t *imag, lmmc_real_t scale)
void lmmc_eigen_copy_scaled(const lmmc_mat_t *a, lmmc_real_t scale, lmmc_mat_t *result)
void lmmc_eigen_vectors_2x2(const lmmc_mat_t *a, lmmc_real_t scale, lmmc_eigen_gen_full_result_t *result)
lmmc_status_t lmmc_eigen_inverse_vectors(const lmmc_mat_t *a, lmmc_eigen_gen_full_result_t *result)
lmmc_status_t lmmc_eigen_matrix_scale(const lmmc_mat_t *a, lmmc_real_t *scale)
特征值 / SVD 模块内部共享的缩放、Householder 与 Givens 辅助接口(仅源文件可见)。
#define MAT_ELEM(mat, i, j)
LMMC 内部使用的公共工具(仅源文件可见).
稠密矩阵直接分解接口(LU、Cholesky、QR)。
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_INVALID_ARGUMENT