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

- Subscribe to 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
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

09-09-2015 07:55 AM

I have a set of vectors that i generate by randomly sampling from a larger vector (the item are words/characters).

I do it in a do loop and after each iteration i have a 1*4 or a 1*3 vector. I would like to collect all of these vectors into a matrix whose size is N*4, where N is the number of loops. In cases where the vectors are 1*3, the last item in a row of a matrix will be missing. I was hoping to initially create a N*4 matrix of zeros, and after each loop, insert the vector (either the 1*3 or 1*4) in row i, where i go from 1 to N.

Can anyone suggest an efficient code for implementing this task?

Thanks for your help,

Tzachi

Accepted Solutions

Solution

09-25-2015
06:23 AM

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

Posted in reply to Tzachi

09-09-2015 08:31 AM

It would have been useful for you to have posted your code.

Because you are storing character values, you can't allocate a numerical matrix of zeros. Instead you need to allocate a character matrix of blank strings. See the article "How to create a string of a specified length" for tips about how to create a matrix that contains a matrix that contains all blank strings. Then inside the loop you look at the number of elements of each sample and assign it to columns 1:3 or 1:4 of the i_th row, as follows:

```
proc iml;
call randseed(1234);
list = {peter piper picked a peck of pickled peppers};
N = 10;
/* determine number of items */
numItems = sample({3 4}, N);
print numItems;
/* Allocate matrix for results. See
http://blogs.sas.com/content/iml/2014/05/12/how-to-create-a-string-of-a-specified-length-in-sasiml.html */
results = j(N, 4, BlankStr(nleng(list)));
do i = 1 to N;
items = sample(list, numItems[i]);
results[i, 1:ncol(items)] = items;
end;
print results;
```

All Replies

Solution

09-25-2015
06:23 AM

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

Posted in reply to Tzachi

09-09-2015 08:31 AM

It would have been useful for you to have posted your code.

Because you are storing character values, you can't allocate a numerical matrix of zeros. Instead you need to allocate a character matrix of blank strings. See the article "How to create a string of a specified length" for tips about how to create a matrix that contains a matrix that contains all blank strings. Then inside the loop you look at the number of elements of each sample and assign it to columns 1:3 or 1:4 of the i_th row, as follows:

```
proc iml;
call randseed(1234);
list = {peter piper picked a peck of pickled peppers};
N = 10;
/* determine number of items */
numItems = sample({3 4}, N);
print numItems;
/* Allocate matrix for results. See
http://blogs.sas.com/content/iml/2014/05/12/how-to-create-a-string-of-a-specified-length-in-sasiml.html */
results = j(N, 4, BlankStr(nleng(list)));
do i = 1 to N;
items = sample(list, numItems[i]);
results[i, 1:ncol(items)] = items;
end;
print results;
```

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

Posted in reply to Rick_SAS

09-10-2015 05:32 PM

Thanks very much Rick!