グローバル変数を使用する他の人のコードを変更しようとしていますが、理解できないエラーが発生し続けます。グローバル変数を使用するのはこれが初めてなので、それが関係しているのではないかと思います。次のエラーが表示されます。
Attempt to reference field of non-structure array.
Error in likelihood (line 35)
X=ModelInfo.X;
これは私が実行するコードです:
clearvars -global
clearvars
global ModelInfo
%Pull in data from MySQL database
ModelInfo.X=..... %76x2 double type
ModelInfo.y=..... %76x1 double type
addpath('C:/.../Sampling Plans');
addpath('C:/.../Constructing a Surrogate');
%Number of variables
k=size(ModelInfo.X,2);
%Number of sample points
n=size(ModelInfo.X,1);
%Set upper and lower bounds for search of log theta
UpperTheta=ones(1,k).*2;
LowerTheta=ones(1,k).*-3;
%Run GA search of likelihood
[ModelInfo.Theta,MinNegLnLikelihood]=ga(@likelihood,k,[],[],[],[],LowerTheta,UpperTheta);
...外部関数の可能性を参照します(他の誰かによって書かれました):
function [NegLnLike,Psi,U]=likelihood(x)
global ModelInfo
X=ModelInfo.X;
y=ModelInfo.y;
theta=10.^x;
p=2;
n=size(X,1);
one=ones(n,1);
% Pre-allocate memory
Psi=zeros(n,n);
% Build upper half of correlation matrix
for i=1:n
for j=i+1:n
Psi(i,j)=exp(-sum(theta.*abs(X(i,:)-X(j,:)).^p));
end
end
% Add upper and lower halves and diagonal of ones plus
% small number to reduce ill-conditioning
Psi=Psi+Psi'+eye(n)+eye(n).*eps;
% Cholesky factorisation
[U,p]=chol(Psi);
% Use penalty if ill-conditioned
if p>0
NegLnLike=1e4;
else
% Sum lns of diagonal to find ln(abs(det(Psi)))
LnDetPsi=2*sum(log(abs(diag(U))));
% Use back-substitution of Cholesky instead of inverse
mu=(one'*(U\(U'\y)))/(one'*(U\(U'\one)));
SigmaSqr=((y-one*mu)'*(U\(U'\(y-one*mu))))/n;
NegLnLike=-1*(-(n/2)*log(SigmaSqr) - 0.5*LnDetPsi);
end
アップデート:
問題を理解しました。最初に ModelInfo をグローバル変数として宣言し、%Pull in data from MySQL database
セクション内でデータベース接続を作成し、コマンドを使用して不要になったいくつかの変数をクリアしclearvars -except
ましたが、そのリストには ModelInfo を含めませんでした。その後、ModelInfo にデータを入れます。それはグローバルなので、ローカル コピーまたはグローバル コピーのいずれかを削除したと思いますが (よくわかりません)、ワークスペース内の変数のリストにまだ表示され、isstruct(ModelInfo)
1 が返されたままです...明らかに問題を示すものは何もありませんでしたエラー以外。