楼主: freetiger
1580 6

关于迭代、宏的求助 [推广有奖]

  • 0关注
  • 0粉丝

博士生

34%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
4.5000
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
2507 点
帖子
100
精华
0
在线时间
371 小时
注册时间
2011-1-17
最后登录
2024-1-10

10论坛币
手头项目需要反复迭代,目前考虑的流程如下:
  1. %macro P1(x=,y=);
  2. ....
  3. myValue=...;
  4. call symputx('myFunc',myValue);
  5. %mend;

  6. %macro check;
  7. data D0;
  8. /*初始化数据*/
  9. ...
  10. call execute('%P1(x=x0,y=y0)');
  11. run;

  12. %do i=1 %to 1000;/*迭代1000次。因call execute必须在data步结束后才能生效,只能每调用一次宏就建个数据集?*/
  13.         data PSO_&i;
  14.         set PSO_%eval(&i-1);
  15.         tmpV=symgetn('myFunc');
  16.         ...
  17.         计算后调整x,y的值返回给macro P1:
  18.         call execute('%P1(x=x1,y=y1)');
  19.         ...
  20. %end;

  21. run;
  22. %mend;
  23. %check;
复制代码
每次迭代都要建个数据集,似乎很不合理。不知道有什么解决办法?盼指点

最佳答案

yongyitian 查看完整内容

在一个数据步中,定义一个或多个多维数组存储原始数据和计算结果。 当数据步运行到set语句中数据集的最后一条记录时用do-loop做其他计算. retain 数组中的数据.
关键词:EXECUTE symput Macro value check 项目
沙发
yongyitian 发表于 2015-2-25 19:46:24 |只看作者 |坛友微信交流群
freetiger 发表于 2015-2-28 18:25
看例子,NLP是直接对显式函数进行处理。我现在面临的问题是,目标函数是在数据集运算后的结果。
在一个数据步中,定义一个或多个多维数组存储原始数据和计算结果。 当数据步运行到set语句中数据集的最后一条记录时用do-loop做其他计算.  retain 数组中的数据.
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
freetiger + 1 + 1 + 1 让您费心了!我还不清楚怎么解决,慢慢学习.

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

藤椅
yongyitian 发表于 2015-2-26 12:27:36 |只看作者 |坛友微信交流群
  1. %macro P1(x=,y=);
  2. ....
  3. myValue=...;
  4. call symputx('myFunc',myValue);
  5. %mend;

  6. %macro check;
  7. data D0;
  8. /*初始化数据*/
  9. ...
  10. * call execute('P1(x=x0,y=y0)');
  11.   call execute('%P1(x=' || x0 || ', ' ||'y=' || y0 ||')');   
  12. run;

  13. %do i=1 %to 1000;/*迭代1000次。因call execute必须在data步结束后才能生效,只能每调用一次宏就建个数据集?*/
  14.       *  data PSO_&i;
  15.       *  set PSO_%eval(&i-1);
  16.         data temp;
  17.           set PSO_0  
  18.         tmpV=symgetn('myFunc');
  19.         ...
  20.         计算后调整x,y的值返回给macro P1:
  21.       * call execute('%P1(x=x1,y=y1)');
  22.         call execute('%P1(x=' || x1 || ', ' || 'y=' || y1 || ')');
  23.         ...
  24.         run;

  25.         data PSO_0;
  26.           set temp;
  27.         run;
  28. %end;

  29. * run;
  30. %mend;
  31. %check;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
freetiger + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

板凳
freetiger 发表于 2015-2-26 14:32:15 |只看作者 |坛友微信交流群
谢谢楼上解答!很管用,获益匪浅。
运行时间有所减少,但和NLP相比还是慢了很多。不知道思路上需要做什么改进?

使用道具

报纸
yongyitian 发表于 2015-2-27 22:48:08 |只看作者 |坛友微信交流群
freetiger 发表于 2015-2-26 14:32
谢谢楼上解答!很管用,获益匪浅。
运行时间有所减少,但和NLP相比还是慢了很多。不知道思路上需要做什么改 ...
感觉NLP procedure 不用 open/close 数据集很多次。如果你的问题可以用nlp procedure 解决,也许可以在一个数据步中用temp-variable, do-loop,if, goto 等语句完成.

坛中有很多大神,但是没有数据和清楚的目的,大神会游过的.
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
freetiger + 1 + 1 + 1 NL

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

地板
wpfwxn 发表于 2015-2-28 08:47:31 |只看作者 |坛友微信交流群
yongyitian 发表于 2015-2-27 22:48
感觉NLP procedure 不用 open/close 数据集很多次。如果你的问题可以用nlp procedure 解决,也许可以在一 ...
尝试在一个data步内生成所需的中间数据集,如果是生成宏变量的话,生成那种带循环变量的宏变量
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
freetiger + 1 + 1 + 1 不通过中间数据集,直接在一个data中完成?.

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

7
freetiger 发表于 2015-2-28 18:25:25 |只看作者 |坛友微信交流群
yongyitian 发表于 2015-2-27 22:48
感觉NLP procedure 不用 open/close 数据集很多次。如果你的问题可以用nlp procedure 解决,也许可以在一 ...
看例子,NLP是直接对显式函数进行处理。我现在面临的问题是,目标函数是在数据集运算后的结果。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 01:56