「cvx型の値をdoubleに変換できない」というエラーの解決方法
- 以下のコードでエラーが発生しました。この問題を解決する方法を教えてください。
`cvx_begin variable E_user(n) nonnegative variable sigma(n) nonnegative variable Sigma(n) nonnegative variable Omega(n) nonnegative obj=0; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sigma=zeros(1,K_num); Sigma=zeros(1,K_num); Omega=zeros(1,K_num);
% Calculate sigma
for t=1:K_num
my_hold=zeros(M*N,M*N);
for i=1:K_num
if i~=t
my_hold=my_hold+E_user(i)*G_DDMA(:,:,i)*G_DDMA(:,:,i)';
end
end
sigma(t)=trace(pinv(D(:,:,t))*U(:,:,t)*H(:,:,t)*my_hold*H(:,:,t)'*U(:,:,t)'*(pinv(D(:,:,t)))');
end
% Calculate Sigma
for t=2:K_num
my_hold=zeros(M*N,M*N);
for i=2:K_num
if i~=t
my_hold=my_hold+E_user(i)*G_DDMA(:,:,i)*G_DDMA(:,:,i)';
end
end
Sigma(t)=trace(pinv(D(:,:,1))*U(:,:,1)*H(:,:,1)*my_hold*H(:,:,1)'*U(:,:,1)'*(pinv(D(:,:,1)))');
end
my_hold=zeros(M*N,M*N);
for i=3:K_num
my_hold=my_hold+E_user(i)*G_DDMA(:,:,i)*G_DDMA(:,:,i)';
end
Sigma(1)=trace(pinv(D(:,:,2))*U(:,:,2)*H(:,:,2)*my_hold*H(:,:,2)'*U(:,:,2)'*(pinv(D(:,:,2)))');
% Calculate Omega
for i=2:K_num
Omega(i)=trace(pinv(D(:,:,1))*U(:,:,1)*H(:,:,1)*G_DDMA(:,:,i)*G_DDMA(:,:,i)'*H(:,:,1)'*U(:,:,1)'*(pinv(D(:,:,1)))');
end
Omega(1)=trace(pinv(D(:,:,2))*U(:,:,2)*H(:,:,2)*G_DDMA(:,:,1)*G_DDMA(:,:,1)'*H(:,:,2)'*U(:,:,2)'*(pinv(D(:,:,2)))');
sigma=real(sigma);
Sigma=real(Sigma);
Omega=real(Omega);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=2:n
obj=obj+log(1+2*beta(i)*sqrt(E_user(1)+alpha*Sigma(1)+N0)-beta(i)^2)*(N0+alpha*sigma(i)*Omega(1))/log(2);
end
obj=obj+log(1+2*beta(1)*sqrt(E_user(2)+alpha*Sigma(2)+N0)-beta(1)^2)*(N0+alpha*sigma(1)*Omega(2))/log(2);
maximize (obj)
E_sum=0;
for i=1:n
E_sum=E_sum+E_user(i);
end
subject to
E_sum<=E_total;
cvx_end`
エラーは「sigma(t)」の行で「型 'cvx' の値を 'double' に変換できないため、割り当てを実行できません」という内容でした。
- 変数と式を混同しているようです。
sigma=zeros(1,K_num); という行は、前に宣言された変数を上書きしています。sigmaは変数として宣言されましたが、my_holdとE_userを含む式であるため、CVX式になります。sigma(t)にmy_holdを含むCVX式を代入しようとしていますが、sigma(t)はdouble型であり、CVX式ではないため、エラーが発生します。
代わりに以下のように宣言してください:
expression sigma(n)
expression Sigma(n)
expression Omega(n)
宣言された式は、CVXによって自動的にすべてゼロで初期化されます。非負である必要がある場合は、以下の制約を追加する必要があります:
sigma >= 0
Sigma >= 0
Omega >= 0