矩阵运算
头文件
#include "mln_matrix.h"
模块名
matrix
相关结构
typedef struct {
mln_size_t row;//矩阵的行数
mln_size_t col;//矩阵的列数
double *data;//一个一维数组,包含了矩阵内所有元素,按行一次排列
mln_u32_t is_ref:1;//标识data是否为外部引用,该标记用于释放矩阵结构时忽略对data的释放
} mln_matrix_t;
函数
mln_matrix_new
mln_matrix_t *mln_matrix_new(mln_size_t row, mln_size_t col, double *data, mln_u32_t is_ref);
描述:创建一个row行col列,数据为data的矩阵。若is_ref为0则表示矩阵结构会完全复制一个data在其中,否则直接引用data。
返回值:成功则返回矩阵结构指针,否则返回NULL
mln_matrix_free
void mln_matrix_free(mln_matrix_t *matrix);
描述:释放矩阵结构内存。
返回值:无
mln_matrix_mul
mln_matrix_t *mln_matrix_mul(mln_matrix_t *m1, mln_matrix_t *m2);
描述:矩阵乘法。
返回值:成功则返回结果矩阵指针,否则返回NULL
mln_matrix_inverse
mln_matrix_t *mln_matrix_inverse(mln_matrix_t *matrix);
描述:矩阵求逆。注意:矩阵求逆要求是该矩阵为方阵。此函数不会修改输入矩阵。
返回值:成功则返回结果矩阵指针,否则返回NULL
mln_matrix_add
mln_matrix_t *mln_matrix_add(mln_matrix_t *m1, mln_matrix_t *m2);
描述:矩阵加法。两个矩阵必须具有相同的维度。
返回值:成功则返回结果矩阵指针,否则返回NULL
mln_matrix_sub
mln_matrix_t *mln_matrix_sub(mln_matrix_t *m1, mln_matrix_t *m2);
描述:矩阵减法。两个矩阵必须具有相同的维度。
返回值:成功则返回结果矩阵指针,否则返回NULL
mln_matrix_scalar_mul
mln_matrix_t *mln_matrix_scalar_mul(double scalar, mln_matrix_t *matrix);
描述:标量乘法。将矩阵中的每个元素乘以scalar。
返回值:成功则返回结果矩阵指针,否则返回NULL
mln_matrix_transpose
mln_matrix_t *mln_matrix_transpose(mln_matrix_t *matrix);
描述:矩阵转置。
返回值:成功则返回结果矩阵指针,否则返回NULL
mln_matrix_det
double mln_matrix_det(mln_matrix_t *matrix);
描述:使用LU分解与部分主元法计算方阵的行列式。此函数不会修改输入矩阵。
返回值:返回行列式的值。若矩阵为NULL或不是方阵,则返回0.0并设置errno为EINVAL。
mln_matrix_dump
void mln_matrix_dump(mln_matrix_t *matrix);
描述:将矩阵的信息输出到标准输出中。仅用于调试。
返回值:无
示例
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "mln_matrix.h"
int main(int argc, char *argv[])
{
mln_matrix_t *a, *b;
double data[] = {1, 1, 1, 1, 2, 4, 2, 8, 64};
a = mln_matrix_new(3, 3, data, 1);
if (a == NULL) {
fprintf(stderr, "init matrix failed\n");
return -1;
}
mln_matrix_dump(a);
b = mln_matrix_inverse(a);
mln_matrix_free(a);
if (b == NULL) {
fprintf(stderr, "inverse failed: %s\n", strerror(errno));
return -1;
}
mln_matrix_dump(b);
mln_matrix_free(b);
return 0;
}