TLDR
我寫了一個代碼來解決一個 SDP 問題。我曾經subs在 cvx 內容之前將 syms 更改為數值,并且在列印出變數后確實看到了數值。但whos() 確實表明該變數仍然是 syms 型別,我認為這可能是我出錯的關鍵點。錯誤訊息顯示如下:
Unable to convert 'cvx' to 'sym'.
trace(rhot*X_ele(:,:,i)) == value(i);它在rhot符號而不是數字的那一行出錯了。
詳細資訊 我正在嘗試撰寫如下 SDP 問題:
function [res] = NH_SDP(rhot,p,value,t)
dim = size(rhot,1);
for i = 1:p
drhot(:,:,i) = diff(rhot,t(i));
end
drhot = subs(drhot,t,value);
rhot = subs(rhot,t,value);
rhott = kron(eye(p),rhot);
% cvx process
cvx_begin sdp
% cvx part
variable L_ele(dim,dim,(1 p)*p/2) hermitian;
variable X_ele(dim,dim,p) hermitian;
cnt = 1;
for i = 1:p
for j = i:p
if i == j
L((i-1)*dim 1:i*dim,(j-1)*dim 1:j*dim) = L_ele(:,:,cnt);
cnt = cnt 1;
else
L((i-1)*dim 1:i*dim,(j-1)*dim 1:j*dim) = L_ele(:,:,cnt);
L((j-1)*dim 1:j*dim,(i-1)*dim 1:i*dim) = L_ele(:,:,cnt);
cnt = cnt 1;
end
end
end
for i = 1:p
X((i-1)*dim 1:i*dim,1:dim) = X_ele(:,:,i);
end
for i = 1:p
X2(1:dim,(i-1)*dim 1:i*dim) = X_ele(:,:,i);
end
% rhott = [[0, 0, 0, 0, 0, 0, 0, 0]
% [0, 1/2, 7/20, 0, 0, 0, 0, 0]
% [0, 7/20, 1/2, 0, 0, 0, 0, 0]
% [0, 0, 0, 0, 0, 0, 0, 0]
% [0, 0, 0, 0, 0, 0, 0, 0]
% [0, 0, 0, 0, 0, 1/2, 7/20, 0]
% [0, 0, 0, 0, 0, 7/20, 1/2, 0]
% [0, 0, 0, 0, 0, 0, 0, 0]];
rhott = double(rhott);
rhot = double(rhot);
drhot = double(drhot);
minimize(trace(rhott*L));
subject to
% rhot = [0 0 0 0;0 1/2 7/20 0;0 7/20 1/2 0;0 0 0 0];
% drhot
for i =1:p
trace(rhot*X_ele(:,:,i)) == value(i);
end
for i = 1:p
for j = 1:p
if i == j
trace(drhot(:,:,i)*X_ele(:,:,j)) == 1;
else
trace(drhot(:,:,i)*X_ele(:,:,j)) == 0;
end
end
end
% semidefinit constraint.
[L X; X2 eye(dim)] >= 0;
cvx_end
res = cvx_optval;
X_ele
end
上面代碼中有三行:
rhott = double(rhott);
rhot = double(rhot);
drhot = double(drhot);
如果我洗掉這三行,則會出現錯誤Unable to convert 'cvx' to 'sym'.,而我rhot已經通過函式更改為數值subs并且我將其列印出來以查看數字,即使whos函式顯示的型別rhot仍然是 syms。
uj5u.com熱心網友回復:
要參考以下檔案subs():
snew = subs(s,old,new)回傳 的副本s,將所有出現的 替換為old,new然后計算s。這里,s是符號標量變數或符號函式的運算式,并old指定要替換的符號標量變數或符號函式。
強調我的。換句話說:subs()將您的符號運算式更改為新的符號運算式。
double()另一方面,將您提供的任何內容轉換為 a type double,即數值。rhott因此最初包含一個符號值,即使它是一個數字。double(rhott)然后將其評估為數字,而不是符號數字。
我想問題就在這里
drhot = subs(drhot,t,value);
rhot = subs(rhot,t,value);
rhott = kron(eye(p),rhot);
您正在用 替換所有出現的twithin drhot,value然后再次替換 on rhot。ifdrhot已經是符號的,即如果輸入rhot, value, t是符號的,這是有道理的,并且確實double呼叫將使您的系統成為數字,而不是符號。另一方面,如果所有輸入都是數字,則subs()不必要地將所有內容轉換為符號變數,從而降低執行速度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/489875.html
下一篇:時間資料集上的K-Means
