0

この質問はこれに続くものです、前の質問を知らなくても答えられるので、新しい質問を投稿するのが方法だと思いました(そうでない場合は申し訳ありません)。前の質問で、.adoファイルの最後にMataコードを置くと、ローカルvar2がStataコード内で使用できるようになると言われました。最小限の例は次のとおりです。

program define hello
args var1
local sum_var=`var1'+`var2'
disp `sum_var'
end

mata
void cens_func(todo, x, y, g, H)
{
y = (x-1)^2
}

S = optimize_init()
optimize_init_evaluator(S, &cens_func())
optimize_init_which(S, "min")
optimize_init_params(S, 2)
temp=optimize(S)
st_local("var2",strofreal(temp))
end

残念ながら実行されません。無効な構文エラーが発生します。これを最初にMataコードを使用して.doファイルで実行しても、エラーは発生しません。ここで何が欠けていますか?前もって感謝します。

4

3 に答える 3

1

具体的には、Stataにプラス記号が表示されるためvar2、aの最初の割り当てが失敗するように定義しないでください。local

Mata関数がStataコードによって呼び出されないという理由だけで、これが機能する可能性はありません。

一般に、「実行されない」や「構文エラー」などのレポートは、何が起こっているかについて他の人に実際の手がかりを与えないため、実際には有益ではありません。Stataはデバッグツールを提供しているため、ここでは問題はありません。これにより、set trace onどの行が失敗しているかを確認できます。

これをdoファイルとして実行すると、プログラムが定義されるだけです。それが合法である、あるいは正しいことを証明するものではありません。

この証拠に基づいて、これを機能させる現実的な見通しを得る前に、いくつかのより単純なプログラムを書いてみてください。マニュアルからサンプルプログラムのいくつかをコピーすることさえ助けになります。

于 2012-11-28T12:17:28.707 に答える
1

昨日の答えを振り返ります。Mataは新しいローカルを作成するか、既存のローカルを変更しますが、作成される前にローカルを使用することはできません。マタとは何の関係もありません。

StataからMataを呼び出す場合は、を参照してくださいhelp m1_ado

var2したがって、コードでは、Mata関数が作成するときに使用する前に、Mata呼び出しが必要になりますvar2

于 2012-11-28T12:58:22.827 に答える
1

私はこれをかなり行います:

program define... 
  tempvar var2
  gen `var2' = <<whatever>>
  mata: myroutine("`var2'")
end

mata:
void myroutine(string scalar inputvar)
{
  real vector v
  st_view(v,.,inputvar)
  <<use v somehow>>
}
end

また、useを呼び出しst_storeて、新しいStata変数を記述します。私のコードはそれをMataに読み込むだけです。

于 2012-12-21T16:09:21.197 に答える