calldynamic_array怎么用对?
How to use call dynamic_array right?
我已经尝试编写一个用户定义的函数 MinDis()
并将其应用于数据步骤,该函数用于计算从一个点到(数字)数组的每个元素的最小距离。代码如下:
proc fcmp outlib = work.funcs.Math;
function MinDis(Exp,Arr[*]);
array dis[2] /symbols;
call dynamic_array(dis,dim(Arr));
do i = 1 to dim(Arr);
dis[i] = abs((Exp - Arr[i]));
end;
return(min(of dis[*]));
endsub;
quit;
option cmplib=work.funcs ;
data MinDis;
input LamdazLower LamdazUpper @;
cards;
2.50 10.0
2.51 10.8
2.49 9.97
2.75 9.50
;
run;
data _null_;
set ;
array _PTN_ [14] _temporary_ (0.5,1,1.5,2,2.5,3,4,5,6,7,8,9,10,12);
StdLamZLow = MinDis(LamdazLower,_PTN_);
StdLamZUpp = MinDis(LamdazUpper,_PTN_);
put _all_;
run;
它编译正确但给出了错误的结果。 StdLamZLow
只求 LamdazLower
到数组 _PTN_
.
前两个元素的最小距离
当我将 dis
的 dim 重写为 999 或一些非常大的东西并删除 call dynamic_array
语句时,我会做对的。但我当然想知道为什么 min(of dis[*])
只是将 dis
作为 2-dim 数组。
顺便问一下,如何使用隐含的 DO 循环 do over ...
来代替显式的 DO 循环?试了几次都没成功
感谢任何提示。
我认为这是动态数组的原因。 MIN
函数仅查看 dis 数组的静态长度(在您的情况下为 2)。因此,您应该尝试在不调用 MIN
函数的情况下计算数组的最小值:
proc fcmp outlib = work.funcs.Math;
function MinDis(Exp,Arr[*]);
length=dim(Arr);
array dis[2] /nosymbols;
call dynamic_array(dis,length);
dis[1]=abs((Exp - Arr[1]));
min=dis[1];
do i = 1 to length;
dis[i] = abs((Exp - Arr[i]));
if dis[i] < min then min=dis[i];
end;
return(min);
endsub;
quit;
输出:
LamdazLower=2.5 LamdazUpper=10 StdLamZLow=0 StdLamZUpp=0
LamdazLower=2.51 LamdazUpper=10.8 StdLamZLow=0.01 StdLamZUpp=0.8
LamdazLower=2.49 LamdazUpper=9.97 StdLamZLow=0.01 StdLamZUpp=0.03
LamdazLower=2.75 LamdazUpper=9.5 StdLamZLow=0.25 StdLamZUpp=0.5
另外关于隐含的 DO 循环(here 第 6 页),如果我正确理解了问题:
data temp;
array dis dis1-dis4;
do over dis;
dis=2;
put _all_;
end;
run;
输出:
I=1 dis1=2 dis2=. dis3=. dis4=. ERROR=0 N=1
I=2 dis1=2 dis2=2 dis3=. dis4=. ERROR=0 N=1
I=3 dis1=2 dis2=2 dis3=2 dis4=. ERROR=0 N=1
I=4 dis1=2 dis2=2 dis3=2 dis4=2 ERROR=0 N=1
我已经尝试编写一个用户定义的函数 MinDis()
并将其应用于数据步骤,该函数用于计算从一个点到(数字)数组的每个元素的最小距离。代码如下:
proc fcmp outlib = work.funcs.Math;
function MinDis(Exp,Arr[*]);
array dis[2] /symbols;
call dynamic_array(dis,dim(Arr));
do i = 1 to dim(Arr);
dis[i] = abs((Exp - Arr[i]));
end;
return(min(of dis[*]));
endsub;
quit;
option cmplib=work.funcs ;
data MinDis;
input LamdazLower LamdazUpper @;
cards;
2.50 10.0
2.51 10.8
2.49 9.97
2.75 9.50
;
run;
data _null_;
set ;
array _PTN_ [14] _temporary_ (0.5,1,1.5,2,2.5,3,4,5,6,7,8,9,10,12);
StdLamZLow = MinDis(LamdazLower,_PTN_);
StdLamZUpp = MinDis(LamdazUpper,_PTN_);
put _all_;
run;
它编译正确但给出了错误的结果。 StdLamZLow
只求 LamdazLower
到数组 _PTN_
.
当我将 dis
的 dim 重写为 999 或一些非常大的东西并删除 call dynamic_array
语句时,我会做对的。但我当然想知道为什么 min(of dis[*])
只是将 dis
作为 2-dim 数组。
顺便问一下,如何使用隐含的 DO 循环 do over ...
来代替显式的 DO 循环?试了几次都没成功
感谢任何提示。
我认为这是动态数组的原因。 MIN
函数仅查看 dis 数组的静态长度(在您的情况下为 2)。因此,您应该尝试在不调用 MIN
函数的情况下计算数组的最小值:
proc fcmp outlib = work.funcs.Math;
function MinDis(Exp,Arr[*]);
length=dim(Arr);
array dis[2] /nosymbols;
call dynamic_array(dis,length);
dis[1]=abs((Exp - Arr[1]));
min=dis[1];
do i = 1 to length;
dis[i] = abs((Exp - Arr[i]));
if dis[i] < min then min=dis[i];
end;
return(min);
endsub;
quit;
输出:
LamdazLower=2.5 LamdazUpper=10 StdLamZLow=0 StdLamZUpp=0
LamdazLower=2.51 LamdazUpper=10.8 StdLamZLow=0.01 StdLamZUpp=0.8
LamdazLower=2.49 LamdazUpper=9.97 StdLamZLow=0.01 StdLamZUpp=0.03
LamdazLower=2.75 LamdazUpper=9.5 StdLamZLow=0.25 StdLamZUpp=0.5
另外关于隐含的 DO 循环(here 第 6 页),如果我正确理解了问题:
data temp;
array dis dis1-dis4;
do over dis;
dis=2;
put _all_;
end;
run;
输出:
I=1 dis1=2 dis2=. dis3=. dis4=. ERROR=0 N=1
I=2 dis1=2 dis2=2 dis3=. dis4=. ERROR=0 N=1
I=3 dis1=2 dis2=2 dis3=2 dis4=. ERROR=0 N=1
I=4 dis1=2 dis2=2 dis3=2 dis4=2 ERROR=0 N=1