What is wrong with my codes?错误使用 .* (第 173 行) Disciplined convex programming error: Cannot perform the operation: {invalid} .* {concave} 出错 * (第 36 行) z = feval( oper, x, y ); value of 'A' and 'B', beta are NaN

num_m = 8;
num_n = 3;
K = 3;
d_min = 10;
d_max = 50;
p_max = 100;
c = 0.056;
rho = 0;
%d = unifrnd(d_min,d_max,num_m,1);
d = [10;20;30;40;50;60;70;80];
gain = UVLC_getchg(num_m,d,c,rho)
pg_sic = zeros(num_m,num_m);
noise = 1e-10*ones(num_m,1);
noise_1 = zeros(num_m,1);
%串行干扰消除
for i = 1:num_m
pg_self = gain(i);
for j = 1:num_m
if i~=j
if gain(j)<gain(i)
pg_sic(i,j) = gain(j)/pg_self;%归一化干信比
end
end
end
noise_1(i) = noise(i)/pg_self;%归一化噪信比
end

f_mn = zeros(num_m,num_n);
rate_vec = ;%存放前几次迭代后的rate
A = zeros(num_m,num_n);
B = zeros(num_m,num_n);
beta = zeros(num_m,num_n);
for epoch = 1:100
if epoch == 1
%初始化,信道分配变量f,功率控制变量p,和速率rate
f_tmp = [1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0];
p_tmp = 100*ones(num_m,1);
r = 0;%存放传感器m的速率
rate = 0;%存放所有传感器的对数效用之和
for i = 1:num_m
for j = 1:num_n
%判断传感器m是否占用信道n,不占用则不用计算
if f_tmp(i,j) ~= 0
r = r + log2(1 + f_tmp(i,j)p_tmp(i)/(pg_sic(i,:slight_smile:(p_tmp.*f_tmp(:,j)) + noise_1(i)));
end
end
rate = rate + log(r);
end
rate_vec=[rate_vec,rate];
end
%每次循环都需要计算分式规划各辅助变量的初值
for i = 1:num_m
for j = 1:num_n
A(i,j) = f_tmp(i,j)p_tmp(i);
B(i,j) = (pg_sic(i,:slight_smile:
(p_tmp.*f_tmp(:,j)) + noise_1(i));
beta(i,j) = sqrt(A(i,j))/(B(i,j));
end
end

%使用cvx工具箱
% 如果可能,最好在开始之前清空之前的问题
cvx_clear
cvx_solver Mosek
cvx_save_prefs %设置为默认求解器
cvx_begin quiet %不显示求解过程,只输出结果
    variable f_tmp(num_m,num_n);%优化变量,不可以赋值修改,可以用双等号==来写约束条件
    expressions obj r1 a b;%中间变量
    obj = 0;
    r1 = 0;
    for i = 1:num_m
        for j = 1:num_n
            a = f_tmp(i,j)*p_tmp(i);%对应A
            b = (pg_sic(i,:)*(p_tmp.*f_tmp(:,j)) + noise_1(i));%对应B
            r1 = r1 + log(1+2*beta(i,j)*sqrt(a) - pow_pos(beta(i,j),2)*b)/log(2);%cvx不接受^表示次方,应用函数pow_pos(x,n)
        end
        obj = obj + log(r1);
    end
    maximize obj
    subject to
        f_tmp <= 1%C1
        f_tmp >= 0%C1
        for i = 1:num_m
            %sum(f_tmp(i,:)) <= 1 %C2
            sum(f_tmp(i,:)) == 1 %C2
        end
        for j = 1:num_n
            %sum(f_tmp(:,j)) == K %C3
            sum(f_tmp(:,j)) <= K %C3
        end
cvx_end
rate = cvx_optval

%重新计算和速率

% r = 0;%存放传感器m的速率
% rate = 0;%存放所有传感器的对数效用之和
% for i = 1:num_m
% for j = 1:num_n
% %判断传感器m是否占用信道n,不占用则不用计算
% if f_tmp(i,j) ~= 0
% r = r + log2(1 + f_tmp(i,j)p_tmp(i)/(pg_sic(i,:slight_smile:(p_tmp.*f_tmp(:,j)) + noise_1(i)));
% end
% end
% rate = rate + log(r);
% end

%误差判断
delt = rate-rate_vec(end);
rate_vec = [rate_vec,rate];
if epoch == 1 && delt < 0
    f_mn = [1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0];
end 
if delt >= 0 && delt < 1e-2
    %取整,得到最终的信道分配变量
    for i = 1:num_m
        [~,index] = max(f_tmp(i,:));
        f_mn(i,index) = 1;
    end
    break;
end

end

if any input data in an expression is is NaN, CVX considers it to be invalid.

If a CVX problem is not solved successfully, optimal values may be populated with NaN, which if you assign to input data in a subsequent CVX problem, will cause the {invalid} error message. If you remove quiet, yo can see what is happening with the solver and CVX.