Функция 'subsindex' не определена для значений класса 'struct'

Я использую Matlab, чтобы решить простую модель в экономике. Но я наткнулся на ошибку

Функция 'subsindex' не определена для значений класса 'struct'

когда я запускаю последнюю строку кода.

omega=mkt_share(Par,w,Grid);

Мне кажется, что это связано с тем, что я неоднократно вызываю эту функцию в коде до того, как достигну последней строки, она работает нормально. Может ли кто-нибудь сообщить мне, как решить проблему? Спасибо!

Я выкладываю полный код моей программы следующим образом

clear all

Par.theta = 1.5;
Par.gamma = 6;
Par.beta = 0.1;
Par.zeta = 15;
Par.n = 100;
Grid.q = sort( gprnd(1/Par.zeta,1/Par.zeta,1,Par.n,1));
Grid.q = Grid.q./Grid.q(1);


w0=0.0001;
We0=tot_mkt_share(Par,w0,Grid);
mkt_share=mkt_share(Par,w0,Grid);
w1=0.01;
We1=tot_mkt_share(Par,w1,Grid);
while(We0*We1>0)
    if We0<0 
        w0=w0*0.5;
        We0=tot_mkt_share(Par,w0,Grid);
    end
    if We1>0
        w1=w1*1.5;
        We1=tot_mkt_share(Par,w1,Grid);
    end
end
iconv2=0;
tol2=0.0000001;
maxit2=1000;
it2=1;
while(iconv2==0 && it2<=maxit2)
    w=(w0+w1)/2;
    We=tot_mkt_share(Par,w,Grid);
    if abs(We)<tol2
        iconv2=1;
        disp('wage has converged in')
        it2
    else
        if We*We1>0
            w1=w;
        else
            w0=w;
        end
        it2=it2+1;
    end
end
if it2>=maxit2
    disp('Warning: Zero profit condition not satisfied')
end

omega=mkt_share(Par,w,Grid);

Код для функции mkt_share

function omega=mkt_share(Par,w0,Grid)

omega=w0;

for i=2:Par.n
    rel_q=Grid.q(i);
    fcn=@(omega) (rel_q)^(-Par.gamma)*(omega/w0)^(1-Par.beta*Par.gamma)*((1- 
    ((1-w0)/Par.gamma+w0/Par.theta))/(1- 
    ((1omega)/Par.gamma+omega/Par.theta)))^(Par.gamma-1)-1;

    omega_i=fsolve(fcn,w0);
    omega=[omega',omega_i]';

end

Код для функции tot_mkt_share, которая вызывает функцию mkt_share

function tot_mkt_share=tot_mkt_share(Par,w0,Grid)

tot_mkt_share=sum(mkt_share(Par,w0,Grid))-1;

1 ответ

Когда вы делаете:

mkt_share=mkt_share(Par,w0,Grid);

вы создаете переменную с тем же именем, что и функция. С этого момента функция больше не доступна, она затенена. В последней строке делается попытка проиндексировать эту переменную, а не вызывать функцию по назначению, потому что функция затенена.

Другие вопросы по тегам