turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

Find a Community

Topic Options

- RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

10-09-2015 06:53 AM

I have a matrix, *x*, that is numeric and 49X47. The second row contains all missing values. I would like to reshape it to a square matrix that is 47x47 by eliminating the first and second rows.

The SHAPE function isn't working:

** x2=shape(x,3:49,47);**

I'm getting execution errors telling me that the "*argument should be a scalar.*"

How do I resolve this?

Thank you.

Accepted Solutions

Solution

10-10-2015
08:23 AM

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to xtc283x

10-09-2015 08:06 AM

The documentation for the SHAPE function specifies that the second argument should be the number of columns in the result matrix. You are sending in a vector, which is why you are getting an error.

First use the subscript operator to extract the nonmissing rows, then reshape:

`x2 = shape( x[3:49, ], 47 );`

All Replies

Solution

10-10-2015
08:23 AM

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to xtc283x

10-09-2015 08:06 AM

The documentation for the SHAPE function specifies that the second argument should be the number of columns in the result matrix. You are sending in a vector, which is why you are getting an error.

First use the subscript operator to extract the nonmissing rows, then reshape:

`x2 = shape( x[3:49, ], 47 );`

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to Rick_SAS

10-09-2015 08:35 AM

I think the subscript operator alone is suficient here. The shape function does nothing as the reduced matrix already has 47 rows and 47 columns.

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to Rick_SAS

10-12-2015 08:08 AM

That specification of the *Shape* function worked. When I print the resulting matrix within IML, it is square. However, when I create output containing that matrix, the output resolves to a vector:

Vec2 = the resulting square matrix

create Outputx var {Vec2};

append;

close Outputx;

run;*end Proc IML;

Outputx contains a single column with nxn rows.

Why does Outputx not contain the square matrix Vec2?

Thank you.

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to xtc283x

10-12-2015 08:15 AM

Why does Outputx not contain the square matrix Vec2?

Because you are using the VAR clause in the CREATE statement. Use the FROM clause to write a matrix, as discussed in the article "Writing data from a matrix to a SAS data set."