Я переводя код MATLAB в Haskell, используя библиотеку hmatrix. Все идет хорошо, но Я натыкаюсь на функцию pos, потому что я не знаю, что она делает или что это эквивалент Haskell.Что такое эквивалент Haskell/hmatrix функции MATLAB pos?
код 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 делает что-то с размером матрицы? Googling «Функция matlab pos» не принесла ничего полезного, поэтому любые указатели очень ценятся! (Очевидно, что я мало знаю MATLAB)
Кстати, это для алгоритма TILT для восстановления текстур низкого ранга из шумного искаженного изображения. Я очень взволнован этим, даже если математика вне меня!
Похоже функция поз определена в другом файле MATLAB:
function P = pos(A)
P = A .* double(A > 0);
Я не могу достаточно расшифровать, что это делает. Предполагая, что булевские значения приводят к удвоениям, где «True» == 1.0 и «False» == 0,0
В этом случае он превращает отрицательные значения в ноль и оставляет положительные числа неизменными?
Возможно ли, что ' pos' определяется в другом месте в источнике Matlab? –
Спасибо @ Даниэль Вагнер, это точно так. – nont