Help using Base SAS procedures

PROC FCMP MULT Question

Accepted Solution Solved
Reply
Occasional Contributor
Posts: 17
Accepted Solution

PROC FCMP MULT Question

Hello,

I'm new to PROC FCMP and am trying to get it to do some matrix multiplication as a subroutine.

As an example I have two matrices:

Z:

LOBSIMZ
A1-0.326592916
B11.542436865

CORR:

AB
10.5
0.51

This is as far as I've gotten:

DATA Z;

   INPUT LOB $ SIM Z;

   DATALINES;

A 1 -0.326592916

B 1 1.542436865;

RUN;

DATA CORR;

   INPUT A B;

   DATALINES;

1 0.5

0.5 1;

RUN;

PROC FCMP OUTLIB=WORK.FUNCS.MATRIX;

  SUBROUTINE MMULT(SIM);

  ARRAY Y[2]; OUTARGS Y;

  ARRAY CORR[2,2] / NOSYMBOLS;

  ARRAY Z[2] / NOSYMBOLS;

  RC = READ_ARRAY('CORR', CORR);

  RC = READ_ARRAY('Z', Z, 'Z');

  CALL MULT(Z, CORR, Y);

  RC = WRITE_ARRAY('Z', Y, 'Y');

  ENDSUB;

QUIT;

OPTIONS CMPLIB=WORK.FUNCS;

DATA TEST;

  SET Z;

  DO SIM=1 TO 1;

  CALL MMULT(SIM);

  END;

RUN;

...and I'm still getting these errors:

ERROR: Argument 3 to subroutine MULT must be a matrix at line 0 column 13.

ERROR: Error reported in function 'MULT' in statement number 5 at line 10 column 4.

Any help would be greatly appreciated!

Thanks

Emre


Accepted Solutions
Solution
‎11-14-2013 06:43 AM
Occasional Contributor
Posts: 17

Re: PROC FCMP MULT Question

This works:

PROC FCMP OUTLIB=WORK.FUNCS.MATRIX;

  SUBROUTINE MMULT(SIM);

  ARRAY Y[2]; OUTARGS Y;

  ARRAY CORR[2,2] / NOSYMBOLS;

  ARRAY Z[2] / NOSYMBOLS;

  RC1 = READ_ARRAY('CORR_COP', CORR);

  RC2 = READ_ARRAY('Z', Z, 'Z');

  CALL MULT(Z, CORR, Y);

  RC3 = WRITE_ARRAY('Y', Y, 'Y');

  PUT Z=;

  PUT CORR=;

  PUT Y=;

  ENDSUB;

QUIT;

OPTIONS CMPLIB=WORK.FUNCS;

DATA TEST;

  SET Z;

  DO SIM=1 TO 1;

  CALL MMULT(SIM);

  OUTPUT;

  END;

RUN;

View solution in original post


All Replies
Solution
‎11-14-2013 06:43 AM
Occasional Contributor
Posts: 17

Re: PROC FCMP MULT Question

This works:

PROC FCMP OUTLIB=WORK.FUNCS.MATRIX;

  SUBROUTINE MMULT(SIM);

  ARRAY Y[2]; OUTARGS Y;

  ARRAY CORR[2,2] / NOSYMBOLS;

  ARRAY Z[2] / NOSYMBOLS;

  RC1 = READ_ARRAY('CORR_COP', CORR);

  RC2 = READ_ARRAY('Z', Z, 'Z');

  CALL MULT(Z, CORR, Y);

  RC3 = WRITE_ARRAY('Y', Y, 'Y');

  PUT Z=;

  PUT CORR=;

  PUT Y=;

  ENDSUB;

QUIT;

OPTIONS CMPLIB=WORK.FUNCS;

DATA TEST;

  SET Z;

  DO SIM=1 TO 1;

  CALL MMULT(SIM);

  OUTPUT;

  END;

RUN;

☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

Discussion stats
  • 1 reply
  • 324 views
  • 0 likes
  • 1 in conversation