bbs0805 发表于 2013-11-18 18:31 
我仔细看了你的程序,发现程序中错误太多,包括:宏的定义、宏的引用、关系表达式、矩阵运算、矩阵元素提取 ...
我这基础上添加了两个矩阵,好像不能用了。
这个syntax namelist是不是有限制啊。
我看help里面也是给出了(min=2, max=2)的情况
cap program drop LMDI
program define LMDI,rclass
version 12
syntax namelist(min=4 max=4)
gettoken Y0 Y1 X0 X1:namelist
local r = rowsof(`Y0')
local c = colsof(`Y0')
mat L=J(`r',`c',.)
local i = 1
while `i'<=`r' {
local j = 1
while `j'<=`c' {
local y0= el(Y0,`i',`j')
local y1= el(Y1,`i',`j')
local x0= el(X0,`i',`j')
local x1= el(X1,`i',`j')
*------y0*y1==0
if `y0'==0 & `y1'==0{
local l=0
}
else if `y0'*`y1'==0 & `x0'*`x1'<>0 {
local l=0
}
else if `y0'*`y1'==0 & `x0'*`x1'==0 {
local l=`y1'-`y0'
}
*------y0*y1>0
else if `y0'*`y1'>0 & `x0'*`x1'>0 {
local l=(`y1'-`y0')/(ln(`y1'/`y0'))*ln(`x1'/`x0')
}
else if `y0'*`y1'>0 & `x0'*`x1'<0 & `x0'<0 {
local l=(`y1'-`y0')/(ln(`y1'/`y0'))*(ln(`x1'/1E-200)+ln(-1E-200/`x0'))
}
else if `y0'*`y1'>0 & `x0'*`x1'<0 & `x0'>0 {
local l=(`y1'-`y0')/(ln(`y1'/`y0'))*(ln(-`x1'/1E-200)+ln(1E-200/`x0'))
}
*------y0*y1<0 & x0*x1>0
else if `y0'*`y1'<0 & `x0'*`x1'>0 & `y0'<0 {
local l=((-1E-200-`y0')/ln(-1E-200/`y0')+(`y1'-1E-200)/ln(`y1'/1E-200))*ln(`x1'/`x0')
}
else if `y0'*`y1'<0 & `x0'*`x1'>0 & `y0'>0 {
local l=((1E-200-`y0')/ln(1E-200/`y0')+(`y1'-(-1E-200))/ln(-`y1'/1E-200))*ln(`x1'/`x0')
}
*------y0*y1<0 & x0*x1<0
*------ ->+ ->+
else if `y0'*`y1'<0 & `x0'*`x1'<0 & `y0'<0 & `x0'<0 {
local l=(-1E-200-`y0')/ln(-1E-200/`y0')*ln(-1E-200/`x0') + (`y1'-1E-200)/ln(`y1'/1E-200)*ln(`x1'/1E-200)
}
*------ ->+ +>-
else if `y0'*`y1'<0 & `x0'*`x1'<0 & `y0'<0 & `x0'>0 {
local l=(-1E-200-`y0')/ln(-1E-200/`y0')*ln(1E-200/`x0') + (`y1'-1E-200)/ln(`y1'/1E-200)*ln(-`x1'/1E-200)
}
*------ +>- ->+
else if `y0'*`y1'<0 & `x0'*`x1'<0 & `y0'>0 & `x0'<0 {
local l=(1E-200-`y0')/ln(-1E-200/`y0')*ln(-1E-200/`x0') + (`y1'-(-1E-200))/ln(`y1'/1E-200)*ln(`x1'/1E-200)
}
*------ +>- +>-
else if `y0'*`y1'<0 & `x0'*`x1'<0 & `y0'>0 & `x0'>0 {
local l=(1E-200-`y0')/ln(-1E-200/`y0')*ln(1E-200/`x0') + (`y1'-(-1E-200))/ln(`y1'/1E-200)*ln(-`x1'/1E-200)
}
*------
mat L[`i',`j']=`l'
local j = `j'+1
}
local i = `i'+1
}
return matrix L=L
end