我将使用hmatrix库将一些MATLAB代码翻译成Haskell。进展顺利,但是我在pos函数上遇到了困难,因为我不知道它的作用,也不知道它在Haskell中的等价物是什么。
MATLAB代码如下:
MATLAB代码如下:
[U,S,V] = svd(Y,0);
diagS = diag(S);
...
A = U * diag(pos(diagS-tau)) * V';
E = sign(Y) .* pos( abs(Y) - lambda*tau );
M = D - A - E;
我目前的Haskell翻译:
(u,s,v) = svd y
diagS = diag s
a = u `multiply` (diagS - tau) `multiply` v
这段代码在类型检查中是没有问题的,但是当然,缺少了 "pos" 调用,就会抛出错误:
inconsistent dimensions in matrix product (3,3) x (4,4)
我猜测pos函数与矩阵大小有关?通过谷歌搜索“matlab pos function”没有找到相关有用信息,所以非常感谢任何指点!(显然我不太懂MATLAB)
顺便说一下,这是用于从嘈杂、扭曲的图像中恢复低秩纹理的TILT算法。即使这个公式对我来说太过复杂,我也非常兴奋!
看起来pos函数是在另一个MATLAB文件中定义的:
function P = pos(A)
P = A .* double( A > 0 );
我无法完全理解这段代码的作用。假设布尔值转换为双精度浮点数时,"True"等于1.0,"False"等于0.0。
在这种情况下,它将负数变为零,保持正数不变吗?
pos
在 Matlab 源代码的其他地方是否有定义? - Daniel Wagner