What's wrong with my code? Error using * Incorrect dimensions for matrix multiplication

The error.

Error using  * 
Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of rows in the second matrix. To
perform elementwise multiplication, use '.*'.

Error in cvxprob/eliminate (line 137)
            P       = P * cvx_invert_structure( xR );

Error in cvxprob/solve (line 18)
[ At, cones, sgn, Q, P, dualized ] = eliminate( prob, true, shim.dualize );

Error in cvx_end (line 88)
        solve( prob );

Error in svm_primal_2 (line 78)
cvx_end

Error in opt_phase_shift_matrix (line 168)
[V] = svm_primal_2(para,h_RU,h_RE,h_iR,h_iU,h_iE,h_UE,h_UR,para.M+1,S,scheduling2,transmit_p,jamming_p);

Error in main (line 114)
[theta_t, sec_rate2] = opt_phase_shift_matrix(para,h_hat,Theta,Q_r,Z_0,scheduling2,transmit_p,jamming_p);

The code.

function [V] = svm_primal_2(para,h_RU,h_RE,h_iR,h_iU,h_iE,h_UE,h_UR,M,S,scheduling2,transmit_p,jamming_p)
sigma2 = 10^(para.sigma2_dBm/10)/1000;
sigma_RSI2 = 10^(para.sigma2_dBm/10)/1000;

Tao_0 = zeros(para.K,para.T);
cvx_begin
cvx_solver mosek

%cvx_begin  sdp

variable X(M,M,para.T) complex
variable miu(1,para.T) nonnegative 
variable S(M,M,para.T) complex
variable Tao(para.K,para.N)
variable elta nonnegative
expression secRate(para.K,para.N);
for k = 1:para.K
    for n = 1:para.T 
        if scheduling2(k,n) > 0
            AW_1 = (transmit_p(n)/(sigma2+jamming_p(n)*sigma_RSI2))*diag(conj(h_RU(:,n)'))*conj(h_iR(:,k))*(h_iR(:,k).')*diag(h_RU(:,n)');
            AW_2 = (transmit_p(n)/(sigma2+jamming_p(n)*sigma_RSI2))*diag(conj(h_RU(:,n)'))*conj(h_iR(:,k))*(h_iE(k).');
            AW_3 =  (transmit_p(n)/(sigma2+jamming_p(n)*sigma_RSI2))*conj(h_iU(k,n))*(h_iR(:,k).')*diag(h_RU(:,n)');
            G_W = [AW_1,AW_2;AW_3,0];
            h_W = transmit_p(n) * conj(h_iU(k,n)) * h_iU(k,n);
            secRate(k,n) =  log(1+real(trace(G_W*S(:,:,n))+h_W))./ log(2) - real(Tao(k,n))/((1+Tao_0(k,n))*log(2));
        end
    end
end
throughput_sec = sum(secRate,2);
maximize(elta)

subject to

throughput_sec >= elta %max-min

for k = 1:para.K
    for n = 1:para.T
        if scheduling2(k,n) > 0
            AI_1 =  (transmit_p(n))*diag(conj(h_RE'))*conj(h_iR(:,k))*(h_iR(:,k).')*diag(h_RE');
            AI_2 =  (transmit_p(n))*diag(conj(h_RE'))*conj(h_iR(:,k))*(h_iE(k).');
            AI_3 =  (transmit_p(n))*conj(h_iE(k))*(h_iR(:,k).')*diag(h_RE');
            AU_1 =  (jamming_p(n))*diag(conj(h_RE'))*conj(h_UR(:,n))*(h_UR(:,n).')*diag(h_RE');
            AU_2 =  (jamming_p(n))*diag(conj(h_RE'))*conj(h_UR(:,n))*(h_UE(n).');
            AU_3 =  (jamming_p(n))*conj(h_UE(n))*(h_UR(:,n).')*diag(h_RE');
            G_I = [AI_1,AI_2;AI_3,0];
            G_U = [AU_1,AU_2;AU_3,0];
            h_U = jamming_p(n) * conj(h_UE(n)) * h_UE(n);
            h_I = transmit_p(n) * conj(h_iE(k)) * h_iE(k);
            real(trace(G_I*X(:,:,n)) + miu(n).*h_I) <= real(Tao(k,n));
            trace(G_U*X(:,:,n)) + miu(n).*(h_U)+miu(n).*sigma2 == 1;
        end
    end
end
for n = 1:para.T
    for z =1:M
        for i = 1:M
            for j  = 1:M
                if i == j && z == i && z == j
                    trace(X(i,j,n)) == miu(n);       
                end
            end
        end
    end
end
for n = 1 : para.T
    S(:,:,n) == semidefinite(M);
    X(:,:,n) == semidefinite(M);
    miu(n) >= 0
end  

V = X;
cvx_end

I have checked that there is not problem with matrix dimension. But I don’t know why.

I’ll appreciate if there is anyone could found the way to solve this problem.

I had tested and founded that three subjects would lead to this problem.

real(trace(G_I*X(:,:,n)) + miu(n).*h_I) <= real(Tao(k,n));
trace(G_U*X(:,:,n)) + miu(n).*(h_U)+miu(n).*sigma2 == 1;
trace(X(i,j,n)) == miu(n);

But I still don’t understand.

There may be something wrong in your installation, or your MATLAB session got corrupted. What happens if you try a different solver?

Try it in a new MATLAB session. if that doesn’t resolve the problem, reinstall CVX, and make sure you use CVX 2.2.

All solutions above I’ve tried.
It’s still ’
Error using *
Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of rows in the second matrix. To perform elementwise multiplication, use ‘.*’.’

:sob: :sob: :sob: :sob:

It might be that you overloaded some functions of CVX. For example, you might have defined a “min” function which clash with the CVX’s “min” funcition. To solve this conflict, you can click “set path” in MATLAB, select all CVX-related paths, move them to the top of the path list so that they will have the highest priority.

Thanks! It’s a great solution.

I tried adding real operation to the left and right sides of the equal sign in the problematic formula, and the above error was not reported. I would like to know why this is done and it can solve the problem. I would really appreciate it if you could take the time to answer my question.

real(trace(E_2 .* X(:,:,n))) == real(miu(n));

I don’t know what is going on here.

Thanks a lot! :smiley: :grinning: :grinning: :laughing: :laughing: :laughing:

Is this the same error you got
"Error using *
Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of rows in the second matrix. To operate on each
element of the matrix individually, use TIMES (.*) for elementwise multiplication.

Error in cvxprob/eliminate (line 137)
P = P * cvx_invert_structure( xR );

Error in cvxprob/solve (line 18)
[ At, cones, sgn, Q, P, dualized ] = eliminate( prob, true, shim.dualize );

Error in cvx_end (line 88)
solve( prob );

Error in CHeck_constant_R_F_R_1 (line 224)
cvx_end
"
If it is, how did you solve the problem?