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