# How do I use my own function in CVX model

I was implementing image denoising based on TV minimisation. So the code goes like:
cvx_begin
variable xrec(n,m)
minimise (norm(xrec-A))
subject to
tvTest(xrec)<=780;
cvx_end

Here A is the noisy image. (n,m) is the size of the image, and tvTest is a function that evaluates the total variation of the image:

``````function [s] = tvTest(img)
%% Computes the total variation of the image.
% uy <- y-gradient of the image
ds = sqrt(abs(ux).^2 + abs(uy).^2); % Square of both ux and uy
s = sum(ds(:));                     % Total Variation of the image;
end
``````

The code gives error:
Error using zeros CLASSNAME input must be a valid numeric or logical class name.

Error in gradient (line 56) g = zeros(size(f),class(f)); % case of singleton dimension

I understand that it is not able to apply the gradient on xrec. But then what could be the solution. Can’t I use a function on xrec?

Given that tvTest is called with a CVX variable argument `img'`, all the operations on `img` within that function must satisfy CVX’s rules. In particular, the MATLAB function `gradient` is not supported by CVX; therefore it can not be applied to the argument `img`.

However, I believe `gradient` is just performing numerical differentiation, so you could implement it yourself, and it should result in an x,y vector of affine CVX expressions. (Note that unfortunately, `diff` is not supported by CVX either). Then `ds` can be computed using `norm`, which can be applied to affine CVX expressions. You can not compute `ds` as you have done, because although convex, it violates CVX’s rules (that’s why you use `norm` instead).

You can see a couple of different TV Norm implementations in CVX looking at ncg’s first post at Total Variation (TV) Norm Function Input: Vector or Matrix? , as well as the Royi/mu solution at How to Formulate in CVX - 1D Total Variation Extension . It should be easy to adapt the ideas in these to fit your needs.

So this is fixable. But you must follow CVX’s rule. I recommend you (re-)read the CVX Users’ Guide http://cvxr.com/cvx/doc/ and also read Why isn't CVX accepting my model? READ THIS FIRST!