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 function」をグーグルで検索しても、役立つものは何も見つかりませんでした。(明らかに、私はMATLABをあまり知りません)
ちなみに、これは TILT アルゴリズムがノイズの多い、歪んだ画像から低ランクのテクスチャを復元するためのものです。たとえ数学が私をはるかに超えていたとしても、私はそれについて非常に興奮しています!
pos 関数が別の MATLAB ファイルで定義されているようです。
function P = pos(A)
P = A .* double( A > 0 );
これが何をしているのか完全に解読できません。ブール値が「True」== 1.0 および「False」== 0.0 の double にキャストされると仮定します。
その場合、負の値をゼロにして、正の値を変更しませんか?