之前實現的矩陣庫能夠完成功能,但是在使用上有些麻煩,有的地方使用&,有的地方只有*,而有的地方什麼都不用加,就顯得符號比較混亂。造成這個問題的原因就是我把所有矩陣的記憶體空間都分配在棧上了!而且由於棧記憶體是有限的,所以當我的矩陣定義過多過後,把stm32的棧給撐爆了。。。表現起來就是:在主函式中多定義乙個變數,然後在其他地方莫名其妙卡住了。程式的棧記憶體是用來儲存臨時變數的,由系統自動管理和釋放,體現在彙編上就是push和pop指令,乙個程式的棧是有限的,這個棧空間大小在系統啟動的時候定義,如stm32的啟動檔案(startup_stm32f10x_hd.s)中開頭就定義到:
stack_size equ
0x00000400
/* 給矩陣動態申請乙個記憶體空間 */
void matrix_t_malloc(struct matrix_t *a, u8 row, u8 column)
/* 釋放矩陣占用的記憶體空間 */
void matrix_t_free(struct matrix_t *a)
使用起來也很簡單
int main(void)
新的矩陣庫中也加入了一些新的函式,如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)
if(a->column != (b->column+c->column-1))
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; ifor(j=0; jm+i+j) += *(tmp1+i*tmp1.column+j);}}
myfree(tmp);
myfree(tmp1);
return0;}
// 將乙個矩陣清零
void matrix_t_zero(struct matrix_t *a)
另外transport函式也進行了更改,支援將矩陣逆序再傳遞到另乙個矩陣中。
/* a = b(x1:x2, y1:y2),支援x1int8_t matrix_t_transport(struct matrix_t *a, const
struct matrix_t *b,
u8 x1, u8 x2, u8 y1, u8 y2)
if(a->row != (abs(x2-x1)+1) || a->column != (abs(y2-y1)+1))
for(i=0; irow; i++)else
if(x1 >= x2 && y1 >= y2)else}}
return
0;}
我的C程式語言學習日記 02
這幾個函式包含了型別 運算子和表示式在內的許多知識點,例子中使用了具體主函式來檢驗其效果,各個函式都有其十分有用的功能 strlen 計算字串長度 atoi 將數字字串轉換為對應數值 lower 將大寫字母轉換為小寫 squeeze 將與要求相符的字元從字串中刪去 strcat 將兩個字串連線起來 ...
C語言 作業02
這個作業屬於哪個課程 這個作業要求在 這個作業的目標 學會精確的提問並且能夠使用scanf和printf 學號 20209021 二.作業的內容 1 1請仔細閱讀 提問的智慧型 用自己的話描你的收穫,並舉列子說明應該如何提問。收穫1.不能隨意提出問題,要先經過自己的思考,查資加料,因為這樣才對雙方都...
C語言!作業02
這個作業屬於哪個課程 這個作業要求在 homework 11451 這個作業的目標 掌握使用for迴圈語句實現指定次數的迴圈程式設計 學號20209202 從pta題目集中選出3個你最滿意的題目完成以下內容,選擇題目難度越大,分值越高,每題2分。題目內容描述 本題要求編寫程式,計算序列 1 1 4 ...