我有一个小代码片段,我在其中定义了一个在i
循环中使用的本地宏forvalues
:
matrix I=I(4)
scalar x1=b[1,1]
scalar sum1=0
local i = 2
forvalues i = 2/4 {
scalar chk=i-1
forvalues j = 1/`=chk' {
scalar sum1=I[`i',`j']*x`j'+sum1
}
scalar x`i'=(b[`i',1]-sum1)/I[`i',`i']
}
然而,Stata抱怨说:
error 111
i not found
请注意,只有在循环中使用宏时才会出现此错误,否则不会出现此错误。
你提出的Stata问题就是这条线
scalar chk = i - 1
Stata在那里看到了对i
的引用,显然不能将其解释为变量或标量名称,因此您得到的错误消息。这是Stata的观点。
从您的角度来看,错误不是使用单引号来提取本地宏i
的值或内容,或者至少看起来是您的意图,因为您无法解释您的目标。所以,什么都没有消失;你刚才提到了一个不存在的实体。然而,这只是一个细节,这里有一个更大的故事。
这是您的代码的第一次重写。
matrix I = I(4)
scalar x1 = b[1,1]
scalar sum1 = 0
forvalues i = 2/4 {
local chk = `i' - 1
forvalues j = 1/`chk' {
scalar sum1 = I[`i',`j'] * x`j' + sum1
}
scalar x`i' = (b[`i',1] - sum1) / I[`i',`i']
}
笔记。
local i = 2
似乎是多余的。 forvalues
循环初始化宏。但是等一下:I(4)
只是一个有4行和1列的单位矩阵,主对角线为1,其他地方为0。所以
I[`i',`i']
必须是1和
I[`i',`j']
因为矩阵的同一行上的早期条目是0.所以sum1
永远不会是0.所以你不需要任何明显目的的单位矩阵,你的代码似乎可以简化为从向量中提取四个标量:
forvalues i = 1/4 {
scalar x`i' = b[`i',1]
}
编辑。双循环就像
forvalues i = 2/4 {
local chk = `i' - 1
forvalues j = 1/`chk' {
...
}
...
}
也可以写得更简洁
forvalues i = 2/4 {
forvalues j = 1/`= `i' - 1' {
...
}
...
}