我的C语言矩阵库_2
来源:互联网 发布:阿里云域名实名认证 编辑:程序博客网 时间:2024/06/16 17:51
之前实现的矩阵库能够完成功能,但是在使用上有些麻烦,有的地方使用&,有的地方只有*,而有的地方什么都不用加,就显得符号比较混乱。造成这个问题的原因就是我把所有矩阵的内存空间都分配在栈上了!而且由于栈内存是有限的,所以当我的矩阵定义过多过后,把STM32的栈给撑爆了。。。表现起来就是:在主函数中多定义一个变量,然后在其他地方莫名其妙卡住了。程序的栈内存是用来存储临时变量的,由系统自动管理和释放,体现在汇编上就是PUSH和POP指令,一个程序的栈是有限的,这个栈空间大小在系统启动的时候定义,如STM32的启动文件(startup_stm32f10x_hd.s)中开头就定义到:
Stack_Size EQU 0x00000400
这就是STM32默认栈空间的大小,为1KB,当我把这个值该为2KB后,之前出错的地方就全部正常了,但这只是权宜之计,最根本的办法使用malloc动态分配内存,将所有的矩阵都分配到堆内存中。
之前的工程中没有使用系统的malloc函数,为了方便起见这里使用的是原子的mymalloc函数,新的矩阵库下载点击这里。
其中新加入了matrix_t_malloc函数和matrix_t_free函数。
/* 给矩阵动态申请一个内存空间 */void matrix_t_malloc(struct matrix_t *A, u8 row, u8 column){ A->m = mymalloc(column * row * sizeof(float)); A->row = row; A->column = column;}/* 释放矩阵占用的内存空间 */void matrix_t_free(struct matrix_t *A){ myfree(A->m); A->m = 0; A->row = 0; A->column = 0;}
使用起来也很简单
int main(void){ ... struct matrix_t A; matrix_t_malloc(&A, 3, 3); matrix_t_zero(&A); matrix_t_show("A", &A); matrix_t_free(&A); return 0;}
新的矩阵库中也加入了一些新的函数,如matlab中的conv,用来求多项式的乘积,还有将矩阵清零的函数:
/* 多项式相乘函数,如conv([1 2], [3 4])表示: (1+2x)(3+4x)* A = conv(A, B),A和B必须是行向量 * 这里要根据输入行向量的大小动态初始化临时变量的大小,所以必须用malloc动态申请内存*/int8_t matrix_t_conv(struct matrix_t *A, const struct matrix_t *B, const struct matrix_t *C){ float *tmp; float *tmp1; u8 i,j; struct matrix_t TMP, TMP1; if(B->row != 1 || C->row != 1 || A->row != 1){ return -1; } if(A->column != (B->column+C->column-1)){ return -2; } tmp = mymalloc(B->column * 1 * sizeof(float)); tmp1 = mymalloc(B->column * C->column * sizeof(float)); MATRIX_INIT(TMP, tmp, B->column, 1); MATRIX_INIT(TMP1, tmp1, B->column, C->column); memset(A->m, 0, A->column * A->row * sizeof(float)); matrix_t_T(&TMP, B); matrix_t_mul(&TMP1, &TMP, C, 1); for(i=0; i<TMP1.row; i++){ for(j=0; j<TMP1.column; j++){ *(A->m+i+j) += *(tmp1+i*TMP1.column+j); } } myfree(tmp); myfree(tmp1); return 0;}// 将一个矩阵清零void matrix_t_zero(struct matrix_t *A){ memset(A->m, 0, A->column * A->row * sizeof(float));}
另外transport函数也进行了更改,支持将矩阵逆序再传递到另一个矩阵中。
/* A = B(x1:x2, y1:y2),支持x1<x2, y1<y2,此时矩阵将逆序传递*/int8_t matrix_t_transport(struct matrix_t *A, const struct matrix_t *B, u8 x1, u8 x2, u8 y1, u8 y2){ int i,j; if(B->row < (MAX(x1,x2)+1) || B->column < (MAX(y1,y2)+1)){ return -1; } if(A->row != (abs(x2-x1)+1) || A->column != (abs(y2-y1)+1)){ return -2; } for(i=0; i<A->row; i++){ for(j=0; j<A->column; j++){ if(x1 <= x2 && y1 <= y2){ A->m[i * A->column + j] = B->m[(x1+i) * B->column + y1 + j]; }else if(x1 >= x2 && y1 >= y2){ A->m[i * A->column + j] = B->m[(x1-i) * B->column + y1 - j]; }else{ return -3; } } } return 0;}
阅读全文
0 0
- 我的C语言矩阵库_2
- 我的C语言矩阵库
- C语言_2
- C语言心得_2
- C语言基础_2
- C编译器剖析_2.4 C语言的类型系统
- 重学c语言_2
- 数据结构_2:链表:C语言
- C语言中文件的简单写入_2
- 我的c语言
- 我的c语言
- 我的c语言
- 我的C语言
- 我的C语言
- C语言求矩阵的行列式、伴随矩阵、逆矩阵
- 数据结构_2:链表:C语言练习
- c++_2: 类的定义
- C语言(Head First C)-9_2:静态库与动态库:动态库
- 黑魔法师之门(codevs1995)
- Linux实验2
- Git Bash的初学经验以及基本指令
- java常用类库---对象克隆技术
- Worley Noise(二)
- 我的C语言矩阵库_2
- cookie和sessionStorage,localStorage区别
- Win10 64位+VS2015+Opencv3.3.0安装配置
- 浅谈Redis
- 欧拉-伯努利梁横向振动2
- 为什么更喜欢和朋友一起玩游戏
- 欧拉定理与函数
- 课表
- python 操作Redis数据库