I am using CVX to solve the following problem:
cvx_begin quiet
variable x(l)
minimize( norm(x, 1) )
subject to
y == D * x;
cvx_end
In the scenario I am working on, the matrix D has a very particular structure since it is built from a partial Fourier matrix and the identity matrix, that is D = [F I], where F is a “fat” Fourier matrix of size n x m and I is the identity matrix of size n x n. I would like to avoid having to build the matrix D, since I am working with large values of n and m. Because of the particular structure of D the constraint can also be written in terms of the Fourier transform of a section of x. I have been able to replace D computing the Fourier transform making use of “polyval” as follows:
l = m + n;
w = exp(1i * 2 * pi / m * (0:(n-1))');
cvx_begin quiet
variable x(l) complex
expression xft(n)
xft(1) = sum(x(1:m)) / sqrt(m);
for k = 2 : n
xft(k) = polyval(x(m:-1:1), w(k)) / sqrt(m);
end
minimize( norm(x, 1) )
subject to
y == xft + x(m+1:end);
cvx_end
This option works fine and leads to exactly the same solution. I would like to use the Matlab implementation of “fft” in order to speed up the computation of the Fourier transform. Is there an easy way of using it in CVX? I have checked the section “Adding new functions to the atom library” in the tutorial, but haven’t been able to obtain a working version. This is what I have tried (I’ve added this function in a subfolder @cvx):
function y = my_ifft(x)
y = cvx( x.size_, sparse(ifft(full(x.basis_))) );
end
And then I have used this function to compute the constraint. But doesn’t seem to be working… Any suggestions?