楼主: fyfzhdsfdx
2163 11

[原创博文] 急求高手! [推广有奖]

  • 0关注
  • 0粉丝

硕士生

0%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
966 点
帖子
97
精华
0
在线时间
89 小时
注册时间
2012-8-22
最后登录
2016-9-24

楼主
fyfzhdsfdx 发表于 2012-9-13 14:01:34 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我想生成一个对不同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 将终止执行。
求高手帮查找一下问题。十分感谢!
二维码

扫码加我 拉你入群

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

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

关键词:求高手 Error Macro print READ 表达式 ERROR 程序

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

hs是神马?

藤椅
ziyenano 发表于 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);

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














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

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

报纸
fyfzhdsfdx 发表于 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 ...
首先要谢谢您的帮忙!用宏是因为要处理不同的数据集,在这里我只用一个数据集去尝试一下就出错了,而且想调用结果。万分感谢!

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

7
fyfzhdsfdx 发表于 2012-9-13 16:35:28
ziyenano 发表于 2012-9-13 16:32
可以不使用%do ,%if,改用do和if,效果是一样的。
我想问一下,宏中为什么有的加%,有的不加,比如您刚才提到的。有什么区别吗?谢谢!

8
ziyenano 发表于 2012-9-13 17:32:36
fyfzhdsfdx 发表于 2012-9-13 16:35
我想问一下,宏中为什么有的加%,有的不加,比如您刚才提到的。有什么区别吗?谢谢!
举个例子,
a={1,2,3};

%do i=1 %to 3;
if a[&i]<2 then  a[&i]=0;
%end;
系统编译完宏,解析出来是这个样子
if a[1]<2 then a[1]=0;
if a[2]<2 then a[2]=0;
if a[3]<2 then a[3]=0;

do i=1 to 3;
if a<2 then a=0;
end;
即从矩阵a的第一个元素到第三个元素,每个都做一个判断,
并没有解析成三个语句后执行,
这里出来的效果是一样的,宏的主要功能是文本代替;
具体查查资料吧,肯定说得比我清楚的多

9
fyfzhdsfdx 发表于 2012-9-13 17:33:56
ziyenano 发表于 2012-9-13 15:03
%macro k(t,h);
proc iml;
use hh_1;read all into x_1;      [/ba ...
谢谢你那么细心的回答问题,还带注释,十分感动。不过我还得问一下,我sas刚学,可能还有很多东西不知道,所以麻烦啦!我把刚才的程序的单个数据集想换成30个,加个循环就又报错了。并且我想在其他地方调用这个宏产生的矩阵,还不知道怎么用。麻烦啦。程序如下:
%macro k(t,h,n);
proc iml;
%do &n=1 %to 30;
use hh_&n; read all into x_&n;hs_&n=nrow(x_&n);a=j(hs_&n,hs_&n,0);
call symput('hs_&n',compress(char(hs_&n)));
%do i=1 %to &(hs_&n);
%if %sysfunc(abs(&i-&t)) le &h %then %do;
kh=(3/4*&h)*(1-((&i-&t)/&h)*((&i-&t)/&h));a[&i,&i]=kh;%end;
print a;
%end;
%end;
quit;
%mend;
%k(1,10,n);
我不明白宏参数中的n为什么要加,因为不加的话,不对。谢谢啦!

10
ziyenano 发表于 2012-9-13 17:51:42
fyfzhdsfdx 发表于 2012-9-13 17:33
谢谢你那么细心的回答问题,还带注释,十分感动。不过我还得问一下,我sas刚学,可能还有很多东西不知道, ...
%macro k(t,h,n);
proc iml;
%do &n=1 %to 30;        /*如果只有30个数据集的话,%do n=1 %to 30即可,如果想要用一个参数n控制数据集个数的话                                           %do  nn=1  %to &n,下面一句 use  hh_&nn*/
use hh_&n; read all into x_&n;hs_&n=nrow(x_&n);a=j(hs_&n,hs_&n,0);
call symput('hs_&n',compress(char(hs_&n)));
%do i=1 %to &(hs_&n);
%if %sysfunc(abs(&i-&t)) le &h %then %do;
kh=(3/4*&h)*(1-((&i-&t)/&h)*((&i-&t)/&h));a[&i,&i]=kh;%end;
print a;
%end;
%end;quit;
                                /*缺一个%end*/
%mend;
%k(1,10,n);




编译的时候,加了n,且没有赋默认值,所以调用的时候一定要加,即使这个参数在程序里没用;
想存入到数据集中的话,
create table_name from  matrix_name;
append from matrix_name;

题外话:做矩阵处理的话,尽量用矩阵运算,少用循环,SAS iml 细节上可能没有matlab那么方便,但功能
也是很强大的,可以找点资料好好研究。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 01:26