怎么用调用dynamic_array对不对?

我尝试编写一个用户定义的函数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的暗号重写为999或非常大的值,并且摆脱call dynamic_array的声明时,我会做对了。但是我当然想知道为什么min(of dis[*])只将dis当作2维数组。

顺便说一句,如何使用隐式DO循环do over ...代替显式DO循环?我已经尝试过几次了,但是还没有成功。

感谢任何提示。

linwehao 回答:怎么用调用dynamic_array对不对?

我认为这是动态数组的原因。 MIN函数只能看到dis array的静态长度(在您的情况下为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循环(第6页的here)之外,如果我正确理解了以下问题,则:

data temp;
array dis dis1-dis4;
do over dis;
   dis=2;
   put _all_;
end;
run;

输出:

  

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

     

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

     

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

     

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

本文链接:https://www.f2er.com/2949330.html

大家都在问