# 2017q1 Homework5(matrix) contributed by < `xdennisx` > :::danger 注意書寫的格式 --jserv ::: ## 解除大小限制 跪著參考 [jack81306](https://hackmd.io/s/S1_Zi37ae) 解除矩陣大小限制問題 - 用 `getmatrix` 自己給定矩陣的大小 ```c= float** getmatrix(int row,int col) { float **m = malloc(sizeof(float*)*row); for(int i=0; i<row; i++) { m[i]=malloc(sizeof(float)*col); } return m; } ``` - 在 `matrix_extend.c` 的 矩陣相乘時,左矩陣的 col 要跟右矩陣的 row 相等才能做矩陣相乘 ```c= if(l_col!=r_row) return false; ``` - 如此一來就可以自由給定矩陣大小 ```c= float mData[]= {1,2,3,4,5,6,7,8,9,10,11,12}; float nData[]= {1,2,3,4,5,6,7,8,9,10,11,12}; float fixData[]= {38,44,50,56,83,98,113,128,128,152,176,200,173,206,239,272}; algo->assign(&m, mData,4,3); algo->assign(&n, nData,3,4); algo->assign(&fixed, fixData,4,4); ``` :::danger 這實作距離「好」還很遠,你不需要太早跪下去,快去思考和探索 --jserv ::: > 好的,謝謝老師! ## 加入 sse 解除大小限制之後,矩陣就再也不只是方陣,所以使用 sse 好像沒有這麼單純 > 想法:把不足最小矩陣 `4*4` 補滿 0,讓他可以使用 mul 參考 [`illusion030`](https://github.com/illusion030/matrix_oo/blob/master/matrix_sse.c) 的實作 ```c= thiz->row = (row % 4 == 0) ? row : row + (4 - row % 4); thiz->col = (col % 4 == 0) ? col : col + (4 - col % 4); for(int i=0; i<thiz->row; i++) { for(int j=0; j<thiz->col; j++){ if (i >= row || j >= col) PRIV(thiz)[i][j] = 0; else PRIV(thiz)[i][j]=data[i*col+j]; } } ```