0

グローバル変数を使用する他の人のコードを変更しようとしていますが、理解できないエラーが発生し続けます。グローバル変数を使用するのはこれが初めてなので、それが関係しているのではないかと思います。次のエラーが表示されます。

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 が返されたままです...明らかに問題を示すものは何もありませんでしたエラー以外。

4

1 に答える 1

1

それが実際に実行するコードである場合:

%Pull in data from MySQL database
ModelInfo.X=.....   %76x2 double type
ModelInfo.y=.....   %76x1 double type

それがグローバル変数とは何の関係もないのではないかと思います。.....コードを機能させるには、5つのドットではなく、ある種のデータが必要です(上に配置されたコメントは「データを...からプル」を示しているため)。doubleまた、このデータを、同じクラスではない場合、つまり、記載されているサイズで作成する場合は、コメントが示す形式で作成するようにします。

たとえば、これらの行をこれに置き換えるとコードが機能するかどうかを確認してください

ModelInfo.X=rand(76,2)   %76x2 double type
ModelInfo.y=rand(76,1)   %76x1 double type
于 2013-01-29T23:09:08.953 に答える