Open 645770225 opened 1 year ago
作者你好,这部分修改代码有一个BUG需要修正一下。
else if (fabs(_x->data[0]) <= 1e-5f) { w = _x; w = M_numul(w, 1 / M_norm(w, 2)); }
中的w=_x应该改为copy,不然_x会在这个函数中提前被free。
应该改成:
else if (fabs(_x->data[0]) <= 1e-5f) { w = Matrix_copy(_x); w = M_numul(w, 1 / M_norm(w, 2)); }
作者你好,这部分修改代码有一个BUG需要修正一下。
else if (fabs(_x->data[0]) <= 1e-5f) { w = _x; w = M_numul(w, 1 / M_norm(w, 2)); }
中的w=_x应该改为copy,不然_x会在这个函数中提前被free。 应该改成:else if (fabs(_x->data[0]) <= 1e-5f) { w = Matrix_copy(_x); w = M_numul(w, 1 / M_norm(w, 2)); }
这里不会提前释放的,w在w = M_numul(w, 1 / M_norm(w, 2));这一行就指向了一个新生成的matrix,反而是修改后的版本Matrix_copy生成的matrix没有释放,会导致内存泄漏
作者你好,这部分修改代码有一个BUG需要修正一下。
else if (fabs(_x->data[0]) <= 1e-5f) { w = _x; w = M_numul(w, 1 / M_norm(w, 2)); }
中的w=_x应该改为copy,不然_x会在这个函数中提前被free。 应该改成:else if (fabs(_x->data[0]) <= 1e-5f) { w = Matrix_copy(_x); w = M_numul(w, 1 / M_norm(w, 2)); }
好吧,我发现是我本地修改了Mnumul的实现,返回值是新申请了一个矩阵==
不好意思,因为我本地修改了M_numul的实现,返回值是新申请了一个矩阵,所以上面的改动有错误。
if (_x->data[0] > 1e-5f)
{
w = M_add_sub(1, _x, -1, y);
Matrix *temp_w = w;
w = M_numul(w, 1 / M_norm(w, 2));
M_free(temp_w);
}
else if (fabs(_x->data[0]) <= 1e-5f)
{
w = _x;
w = M_numul(w, 1 / M_norm(w, 2));
}
else
{
w = M_add_sub(1, _x, 1, y);
Matrix *temp_w = w;
w = M_numul(w, 1 / M_norm(w, 2));
M_free(temp_w);
}
应该为
if (_x->data[0] > 1e-5f)
{
w = M_add_sub(1,_x,-1,y);
M_numul(w,1/M_norm(w, 2));
}
else if (fabs(_x->data[0]) <= 1e-5f)
{
w = Matrix_copy(_x);
w = M_numul(w, 1 / M_norm(w, 2));
}
else
{
w = M_add_sub(1, _x, 1, y);
M_numul(w, 1 / M_norm(w, 2));
}
作者你好,感谢开源 householder函数使用过程中遇到一些问题,当待变换的向量为0向量时,会计算错误,我将householder函数前4行修改为:
当向量为0向量时,将H阵设为单位阵,计算就不会出现错误了, 此外我看参考文档https://max.book118.com/html/2017/0527/109650252.shtm 中提到sgn(a)在a=0的时候为0,所以将if分支修改为:
从而和文档上对应。