BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
Venky3110
Fluorite | Level 6

Can anybody help with an alternative dynamic code that can work with upto 12*12 matrix for the below code without using Proc IML:-

 

data abc;
input a b;
cards;
1 1
2 2
;
run;

proc iml;
use abc;
read all into A1;
B1=A1**12;
create def from B1;
append from B1;
close def;
print A1;
print B1;
quit;

 

 

 

Venky3110_0-1692704375487.png

 

1 ACCEPTED SOLUTION

Accepted Solutions
FreelanceReinh
Jade | Level 19

Hello @Venky3110,

 

I think you can build something around the CALL POWER routine of PROC FCMP.

 

Here's a quick example:

proc fcmp outlib=work.funcs.test;
subroutine matpow(inds $, outds $, e);
  array A1[12,12] / nosymbols;
  array B1[12,12] / nosymbols;
  rc=read_array(inds, A1);
  call dynamic_array(B1,dim1(A1),dim2(A1));
  call power(A1, e, B1);
  rc=write_array(outds,B1);
endsub;
run;

options cmplib=work.funcs;

data have;
input a b;
cards;
1 2
3 4
;

data _null_;
call matpow('have','want',12);
run;

proc print data=want noobs;
run;

Result:

   B11          B12

138067399    201223170
301834755    439902154

 

View solution in original post

7 REPLIES 7
PaigeMiller
Diamond | Level 26

You could use a DATA step with an array

 

data want;
    set abc;
    array x _numeric_;
    do i=1 to dim(x);
        x(i)=x(i)**12;
    end;
    drop i;
run;

 

 

--
Paige Miller
Venky3110
Fluorite | Level 6
The output is not matching
Venky3110
Fluorite | Level 6

@PaigeMiller Thanks for response.But the output is not matching with my requirement

 

PaigeMiller
Diamond | Level 26

@Venky3110 wrote:

@PaigeMiller Thanks for response.But the output is not matching with my requirement

 


Sorry, disregard my answer above. I forgot that IML ** is different than data step **.

--
Paige Miller
Venky3110
Fluorite | Level 6
No Problems.Thanks for Trying.
FreelanceReinh
Jade | Level 19

Hello @Venky3110,

 

I think you can build something around the CALL POWER routine of PROC FCMP.

 

Here's a quick example:

proc fcmp outlib=work.funcs.test;
subroutine matpow(inds $, outds $, e);
  array A1[12,12] / nosymbols;
  array B1[12,12] / nosymbols;
  rc=read_array(inds, A1);
  call dynamic_array(B1,dim1(A1),dim2(A1));
  call power(A1, e, B1);
  rc=write_array(outds,B1);
endsub;
run;

options cmplib=work.funcs;

data have;
input a b;
cards;
1 2
3 4
;

data _null_;
call matpow('have','want',12);
run;

proc print data=want noobs;
run;

Result:

   B11          B12

138067399    201223170
301834755    439902154

 

Venky3110
Fluorite | Level 6

@FreelanceReinh Thanks for the code. It is working fine. The output is perfect.

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 7 replies
  • 846 views
  • 2 likes
  • 3 in conversation