我正在使用 hmatrix 库将一些 MATLAB 代码转换为 Haskell。它进展顺利,但我在 pos 函数上绊倒了,因为我不知道它的作用或它的 Haskell 等价物会是什么。
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 函数”没有发现任何有用的东西,所以非常感谢任何指针!(显然我对MATLAB了解不多)
顺便说一下,这是为了让 TILT 算法从嘈杂的扭曲图像中恢复低等级纹理。我对此感到非常兴奋,即使数学超出了我的范围!
看起来 pos 函数是在不同的 MATLAB 文件中定义的:
function P = pos(A)
P = A .* double( A > 0 );
我无法完全理解这是在做什么。假设布尔值转换为双精度值,其中 "True" == 1.0 和 "False" == 0.0
在那种情况下,它会将负值变为零并保持正数不变?