Arrays 如何正确使用调用动态数组?

Arrays 如何正确使用调用动态数组?,arrays,sas,dynamic-arrays,Arrays,Sas,Dynamic Arrays,我尝试编写一个用户定义函数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);

我尝试编写一个用户定义函数
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
到数组前两个元素的最小距离
\u PTN

当我将
dis
的dim重写为999或其他非常大的东西,并去掉
call dynamic_array
语句时,我会得到正确的结果。但是我确实想知道为什么把
min(dis[*])
作为一个2维数组

顺便问一下,如何使用隐含DO循环
DO over…
来代替显式DO循环?我试了好几次,但还没有成功


谢谢你的提示。

我认为这是动态数组的原因<代码>最小值函数只需查看dis数组的静态长度(在您的示例中为2)。因此,您应该尝试在不调用
min
函数的情况下计算数组的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;
输出:

I=1dis1=2dis2=。dis3=。dis4=。错误=0 N=1

I=2dis1=2dis2=2dis3=。dis4=。错误=0 N=1

I=3dis1=2dis2=2dis3=2dis4=。错误=0 N=1

I=4 dis1=2 dis2=2 dis3=2 dis4=2错误=0 N=1


这是有道理的。你能多谈谈FCMP中隐含DO循环的用法吗?@whymath编辑了我的答案,但很难理解你想知道什么。我添加了代码示例和使用do over的输出,以及论文。感谢您的详细描述,我的意思是在
proc fcmp
@whymath中使用
do over
。哦,我没有看到任何关于它的内容。我不确定这是否可能。由于参数数量的不确定性,fcmp中似乎不支持隐式数组。无论如何,谢谢你。
data temp;
array dis dis1-dis4;
do over dis;
   dis=2;
   put _all_;
end;
run;