Try   HackMD

2017q1 Homework5(matrix)

contributed by < xdennisx >

注意書寫的格式 jserv

解除大小限制

跪著參考 jack81306 解除矩陣大小限制問題

  • getmatrix 自己給定矩陣的大小
    ​​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 相等才能做矩陣相乘
    ​​if(l_col!=r_row) ​​ return false;
  • 如此一來就可以自由給定矩陣大小
    ​​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);

這實作距離「好」還很遠,你不需要太早跪下去,快去思考和探索 jserv

好的,謝謝老師!

加入 sse

解除大小限制之後,矩陣就再也不只是方陣,所以使用 sse 好像沒有這麼單純

想法:把不足最小矩陣 4*4 補滿 0,讓他可以使用 mul

參考 illusion030 的實作

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]; } }