全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2083 11
2012-09-13
我想生成一个对不同t和h且以kh表达式为对角元的对角矩阵,矩阵的行数为数据集的观测数。代码如下:
%macro k(t,h)
proc iml;
use hh_1; read all into x_1;hs_1=nrow(x_1);a=j(hs_1,hs_1,0);
%do i=1 %to hs;
%if abs(i-&t) le &h %then %do; kh=(3/4&h)(1-((i-&t)/&h)*((i-&t)/&h));a[i,i]=kh;%end;
%end;
print a;
quit;
%mend;
%k(1,1);
但是程序运行后报错:ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是:hs
                                  ERROR: %TO 值(%DO I 循环中)无效。
                                  ERROR: 宏 k 将终止执行。
求高手帮查找一下问题。十分感谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-9-13 14:55:31
%do i=1 %to hs;

hs是神马?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-13 15:03:26
%macro k(t,h);
proc iml;
use hh_1;read all into x_1;      
hs_1=nrow(x_1);
a=j(hs_1,hs_1,0);
%do i=1 %to hs;    /*%do语句中,%to不能是简单的表达式,可以是具体的数值,或者宏变量,宏表达式*/
%if abs(i-&t) le &h %then %do;   /*i也算宏变量,调用时加上&,%if语句中,数据步的函数不能直接调用,需要加上%sysfunc*/
kh=(3/4&h)(1-((i-&t)/&h)*((i-&t)/&h));  /*表达式有问题,乘号没写*/
a[i,i]=kh;
%end;
%end;
print a;
quit;
%mend;
%k(1,1);

修改后

%macro k(t,h);
proc iml;
use hh_1;read all into x_1;   
hs_1=nrow(x_1);
a=j(hs_1,hs_1,0);
call symput('hs',compress(char(hs_1)));
%do i=1 %to &hs;
%if  %sysfunc(abs(&i-&t))<=&h %then %do;
kh=(3/4*&h)*(1-((&i-&t)/&h)*((&i-&t)/&h));
a[&i,&i]=kh;
%end;
%end;
print a;
quit;
%mend;
%k(1,1);

为什么用宏?普通的循环就可以实现,而且更方便。














二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-13 16:16:25
nomad5 发表于 2012-9-13 14:55
%do i=1 %to hs;

hs是神马?
hs是行数的意思。谢谢啊!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-13 16:19:50
ziyenano 发表于 2012-9-13 15:03
%macro k(t,h);
proc iml;
use hh_1;read all into x_1;      [/ba ...
首先要谢谢您的帮忙!用宏是因为要处理不同的数据集,在这里我只用一个数据集去尝试一下就出错了,而且想调用结果。万分感谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-9-13 16:32:17
fyfzhdsfdx 发表于 2012-9-13 16:19
首先要谢谢您的帮忙!用宏是因为要处理不同的数据集,在这里我只用一个数据集去尝试一下就出错了,而且想 ...
可以不使用%do,%if,改用do和if,效果是一样的
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群