How to programme the SPICE(sparse iterative covariance-based estimation)


where R_hat is a constant matrix, a is constant vector consisting matrix A ; R is calculated by a and matrix P=diag(p), that is R = A’*diag(p)*A

my code is: I cannot obtain the right result,who can help me?

cvx_begin sdp quiet
    variable p(1,length(A)) 
    expressions w(length(A),1) complex
    expressions R(M,M) complex
    R = (A'*diag(p)*A); 
    minimize trace_inv(inv_R_hat*R*inv_R_hat)
   
    subject to 
    w =conj(diag(A*inv_hat*A'))/M;       
    1 == p*w ;
cvx_end

I cannot obtain the right result,who can help me?
the SPICE is from SPICE: a sparse covariance-based estimation method for array processing

Don’t take this as an exhaustive list of issues:

Where is the nonnegativity constraint on p?

What are inv_hat and inv_R_hat, and how are they related? I believe your inv_R_hat inside trace_inv should be sqrtm(inv(Rhat)). Is it? And inv_hat should be inv(Rhat),

I think you inadvertently declared complex to be an expression (you should have used expression, not expressions). Anyhow, I don’t think you need the expressions statements at all, because the R = and w = statements make R and w expressions without extra declaration.

Don’t use quiet until you have verified everything is running correctly with correct results. That will allow you to see the solver and CVX output.

Thanks for your reply, as you said, inv_hat is the inverse of R_hat, inv_R_hat is sqrtm(inv(R_hat)), which is stated in my previous code. This is my new code, but I also cannot get the right answer.

cvx_begin
variable p(1,length(A))
R = (A’* diag( p )* A);
minimize trace_inv(inv_R_hatRinv_R_hat)
subject to
w = (diag(A* inv_hat* A’))/M;
1 == p*w ;
p >= 0;
cvx_end

You haven’t shown us the solver and CVX output from running this problem, nor described in what way the answer is not correct. Have yiu tried a simple, easy to diagnose case, such as 2 by 2?

The CVX solver status is failed in the print details when implement the coding which is designed for direction of arrival (DOA) estimation in array signal processing.

Please show all the solver and CVX output.

Thanks for your patience
All printout are as follows:
Warning: This linear matrix inequality appears to be unsymmetric. This is
very likely an error that will produce unexpected results. Please check
the LMI; and, if necessary, re-enter the model.

In cvxprob/newcnstr (line 241)
In >= (line 21)
In cvx/trace_inv (line 28)
In minimize (line 14)
In SPICE_CVX (line 48)
Calling SDPT3 4.0: 1713 variables, 690 equality constraints
For improved efficiency, SDPT3 is solving the dual problem.


num. of constraints = 690
dim. of sdp var = 64, num. of sdp blk = 1
dim. of linear var = 198
dim. of free var = 491
2 linear variables from unrestricted variable.
*** convert ublk to lblk


SDPT3: Infeasible path-following algorithms


version predcorr gam expon scale_data
HKM 1 0.000 1 0
it pstep dstep pinfeas dinfeas gap prim-obj dual-obj cputime

0|0.000|0.000|8.3e+03|4.2e+01|1.3e+05| 0.000000e+00 0.000000e+00| 0:0:00| lu > In linsysolvefun (line 29)
In symqmr>precond (line 122)
In symqmr (line 47)
In linsysolve (line 220)
In HKMpred (line 83)
In sqlpmain (line 341)
In sqlp (line 242)
In cvx_run_solver (line 50)
In cvx_sdpt3>solve (line 362)
In cvxprob/solve (line 422)
In cvx_end (line 87)
In SPICE_CVX (line 55)
Warning: Matrix is close to singular or badly scaled. Results may be
inaccurate. RCOND = 5.974951e-35.
In linsysolvefun (line 29)
In symqmr>precond (line 122)
In symqmr (line 69)
In linsysolve (line 220)
In HKMpred (line 83)
In sqlpmain (line 341)
In sqlp (line 242)
In cvx_run_solver (line 50)
In cvx_sdpt3>solve (line 362)
In cvxprob/solve (line 422)
In cvx_end (line 87)
In SPICE_CVX (line 55)
1
1|0.987|0.920|1.1e+02|3.6e+00|9.7e+03| 9.615070e+02 -2.989027e+02| 0:0:01|
sqlp stop: primal or dual is diverging, 2.4e+18

number of iterations = 1
Total CPU time (secs) = 1.37
CPU time per iteration = 1.37
termination code = 3
DIMACS: 1.1e+02 0.0e+00 9.2e+00 0.0e+00 1.0e+00 7.7e+00


Status: Failed
Optimal value (cvx_optval): NaN

Per the warning, the argument of trace_inv apparently is not symmetric.
Is inv_R_hat exactly symmetric?

Hmm, I’m not sure whether CVX will recognize inv_R_hat*R*inv_R_hat as symmetric (or whether it really matters if it does), even if inv_R_hat is exactly symmetric.

Another approach, still requiring inv_R_hat to be symmetric is per my answer in Generalizing "trace_inv" for matrix quadratic forms