# Matrix Macro Syntax Problem

6 messages
Open this post in threaded view
|

## Matrix Macro Syntax Problem

 I'm missing something,  but I'm not sure what. This is a snippet of syntax based on Kirill's macro for separating a matrix horizontally. I have data with two groups, coded 1 and 2. That separates the matrix into two separate matrices. 'Get x' produces a matrix of dependent variables. 'Get y' extracts the vector of 1's and 2's presorted. The syntax only works if !gr labeled the same as 'y'. The glitch is in the division of matrix 'x'. Prior to that, 'y' can refer to any !gr. However, in order for the division to work, !gr must be coded the same as the second 'get' variable (see blue highlighted). In this case it's 'y', but it could be any name for the vector used to split the 'x' matrix. !max refers to the maximum value by which to split matrix 'x'. I'm assuming others using matrix will be able to spot the error in my logic. define seo (vars=!charend('/')/gr=!charend('/')/max=!charend('/')) . set mxloops=100000000 . /* Separate the two groups. */ compute srt=!gr . sort cases by srt(A) . matrix . get x/var=!vars . get y/var=!gr . compute ind=t(1:nrow(x)) . compute lst=0 . !do !i=1 !to !unquote(!max) . compute flag=(!gr=!i)&*ind . compute fst=lst+1 . compute last=cmax(flag) . do if last . compute lst=last . compute !conc(x,!i)=x(fst:lst,:) . end if . !doend . print fst . print lst . print flag . end matrix . !enddefine. restore . sep vars=dv1 to dv3/gr=y/max='2' . Thanks in advance. Brian ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD
Open this post in threaded view
|

## Re: Matrix Macro Syntax Problem

 Perhaps comment each matrix line with your intention. Would be happy to review after that. ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD
Open this post in threaded view
|

## Re: Matrix Macro Syntax Problem

 Maybe you start with calling the correct macro name:"seo" or "sep"?Mario GieselMunich, Germany Am Dienstag, 17. Dezember 2019, 11:15:54 MEZ hat David Marso <[hidden email]> Folgendes geschrieben: Perhaps comment each matrix line with your intention. Would be happy to review after that.=====================To manage your subscription to SPSSX-L, send a message to[hidden email] (not to SPSSX-L), with no body text except thecommand. To leave the list, send the commandSIGNOFF SPSSX-LFor a list of commands to manage subscriptions, send the commandINFO REFCARD ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD
Open this post in threaded view
|

## Re: Matrix Macro Syntax Problem

 Thanks, Mario,  but that's just a typo. The macro works fine until the syntax that splits the macro, starting with '!do !i=1 !to !unquote(!max).' I'll take David's advice and comment each line. Brian From: SPSSX(r) Discussion <[hidden email]> on behalf of Mario Giesel <[hidden email]> Sent: Tuesday, December 17, 2019 5:25 AM To: [hidden email] <[hidden email]> Subject: Re: Matrix Macro Syntax Problem   Maybe you start with calling the correct macro name: "seo" or "sep"? Mario Giesel Munich, Germany Am Dienstag, 17. Dezember 2019, 11:15:54 MEZ hat David Marso <[hidden email]> Folgendes geschrieben: Perhaps comment each matrix line with your intention. Would be happy to review after that. ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD
Open this post in threaded view
|

## Re: Matrix Macro Syntax Problem

 In reply to this post by bdates Variable names in the dataset are not directly accessed within the matrix-endmatrix command. If you add a 'SET MPRINT ON.' you will see the generated macro code. The line   get y /var = !gr. reads the *dataset* variable y into the *matrix* variable y. They are not identical! Later, in the !do loop you have the line   compute flag = (!gr = !i) &* ind . which will substitute your call with 'gr=y' to be   compute flag = (y = !i) &* ind . This will work as the names are identical. When called with another variable, ie 'gr=z', the substitution generates   compute flag = (z = !i) &* ind . This fails as z is here an unknown matrix variable. The correct line in the macro should be     compute flag = (y = !i) &* ind . as whatever !gr is read into *matrix* y HTH, PR  (My additions in capital letters) *Always helpful with demo data*. DATA LIST LIST / y  z  dv1  dv2  dv3 (5F8.0). BEGIN DATA 1  1    1    1    1 1  1    3    3    3 2  2    2    2    2 2  2    4    4    4 END DATA. DATASET NAME TwoGroupMatrix. SET MPRINT ON. define sep (vars = !charend('/')            /gr = !charend('/')            /max = !charend('/')            ) . set mxloops = 100000000 . /* Separate the two groups. */ compute srt = !gr . sort cases by srt(A) . matrix . get x /var = !vars . get y /var = !gr . compute ind = t(1:nrow(x)) . compute lst = 0 . !do !i = 1 !to !unquote(!max) .   compute flag = (y = !i)&*ind .   compute fst = lst+1 .   compute last = cmax(flag) .   do if last .     compute lst = last .     compute !conc(x,!i) = x(fst:lst,:) .   end if . !doend . print fst . print lst . print flag . PRINT X. PRINT X1. PRINT X2. DISPLAY. end matrix . !enddefine. COMMENT : following line not preceeded by preserve restore . sep vars = dv1 to dv3    /gr   = y      /max  = '2' . sep vars = dv1 to dv3    /gr    = z      /max  = '2' . bdates wrote > I'm missing something,  but I'm not sure what. This is a snippet of syntax > based on Kirill's macro for separating a matrix horizontally. I have data > with two groups, coded 1 and 2. That separates the matrix into two > separate matrices. 'Get x' produces a matrix of dependent variables. 'Get > y' extracts the vector of 1's and 2's presorted. The syntax only works if > !gr labeled the same as 'y'. The glitch is in the division of matrix 'x'. > Prior to that, 'y' can refer to any !gr. However, in order for the > division to work, !gr must be coded the same as the second 'get' variable > (see blue highlighted). In this case it's 'y', but it could be any name > for the vector used to split the 'x' matrix. !max refers to the maximum > value by which to split matrix 'x'. I'm assuming others using matrix will > be able to spot the error in my logic. > > ... > > Thanks in advance. > > Brian > > ===================== > To manage your subscription to SPSSX-L, send a message to > LISTSERV@.UGA >  (not to SPSSX-L), with no body text except the > command. To leave the list, send the command > SIGNOFF SPSSX-L > For a list of commands to manage subscriptions, send the command > INFO REFCARD -- Sent from: http://spssx-discussion.1045642.n5.nabble.com/===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD
Open this post in threaded view
|

## Re: Matrix Macro Syntax Problem

 Perfect! Thank-you so much. Brian From: SPSSX(r) Discussion <[hidden email]> on behalf of PRogman <[hidden email]> Sent: Thursday, December 19, 2019 3:43 PM To: [hidden email] <[hidden email]> Subject: Re: Matrix Macro Syntax Problem   Variable names in the dataset are not directly accessed within the matrix-endmatrix command. If you add a 'SET MPRINT ON.' you will see the generated macro code. The line   get y /var = !gr. reads the *dataset* variable y into the *matrix* variable y. They are not identical! Later, in the !do loop you have the line   compute flag = (!gr = !i) &* ind . which will substitute your call with 'gr=y' to be   compute flag = (y = !i) &* ind . This will work as the names are identical. When called with another variable, ie 'gr=z', the substitution generates   compute flag = (z = !i) &* ind . This fails as z is here an unknown matrix variable. The correct line in the macro should be     compute flag = (y = !i) &* ind . as whatever !gr is read into *matrix* y HTH, PR  (My additions in capital letters) *Always helpful with demo data*. DATA LIST LIST / y  z  dv1  dv2  dv3 (5F8.0). BEGIN DATA 1  1    1    1    1 1  1    3    3    3 2  2    2    2    2 2  2    4    4    4 END DATA. DATASET NAME TwoGroupMatrix. SET MPRINT ON. define sep (vars = !charend('/')            /gr = !charend('/')            /max = !charend('/')            ) . set mxloops = 100000000 . /* Separate the two groups. */ compute srt = !gr . sort cases by srt(A) . matrix . get x /var = !vars . get y /var = !gr . compute ind = t(1:nrow(x)) . compute lst = 0 . !do !i = 1 !to !unquote(!max) .   compute flag = (y = !i)&*ind .   compute fst = lst+1 .   compute last = cmax(flag) .   do if last .     compute lst = last .     compute !conc(x,!i) = x(fst:lst,:) .   end if . !doend . print fst . print lst . print flag . PRINT X. PRINT X1. PRINT X2. DISPLAY. end matrix . !enddefine. COMMENT : following line not preceeded by preserve restore . sep vars = dv1 to dv3    /gr   = y     /max  = '2' . sep vars = dv1 to dv3    /gr    = z     /max  = '2' . bdates wrote > I'm missing something,  but I'm not sure what. This is a snippet of syntax > based on Kirill's macro for separating a matrix horizontally. I have data > with two groups, coded 1 and 2. That separates the matrix into two > separate matrices. 'Get x' produces a matrix of dependent variables. 'Get > y' extracts the vector of 1's and 2's presorted. The syntax only works if > !gr labeled the same as 'y'. The glitch is in the division of matrix 'x'. > Prior to that, 'y' can refer to any !gr. However, in order for the > division to work, !gr must be coded the same as the second 'get' variable > (see blue highlighted). In this case it's 'y', but it could be any name > for the vector used to split the 'x' matrix. !max refers to the maximum > value by which to split matrix 'x'. I'm assuming others using matrix will > be able to spot the error in my logic. > > ... > > Thanks in advance. > > Brian > > ===================== > To manage your subscription to SPSSX-L, send a message to > LISTSERV@.UGA >  (not to SPSSX-L), with no body text except the > command. To leave the list, send the command > SIGNOFF SPSSX-L > For a list of commands to manage subscriptions, send the command > INFO REFCARD -- Sent from: https://nam12.safelinks.protection.outlook.com/?url=http%3A%2F%2Fspssx-discussion.1045642.n5.nabble.com%2F&data=02%7C01%7Cbdates%40SWSOL.ORG%7C7e6094053143483e096b08d784c1b953%7Cecdd61640dbd4227b0986de8e52525ca%7C0%7C0%7C637123839899062043&sdata=qFk3HYxBLFIp9PSfdUEe0I9VLX7WbMFlbxpxydTJANw%3D&reserved=0 ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD ===================== To manage your subscription to SPSSX-L, send a message to [hidden email] (not to SPSSX-L), with no body text except the command. To leave the list, send the command SIGNOFF SPSSX-L For a list of commands to manage subscriptions, send the command INFO REFCARD