Solved
New Contributor
Posts: 4

# Saving vectors into a matrix

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?

Tzachi

Accepted Solutions
Solution
‎09-25-2015 06:23 AM
SAS Super FREQ
Posts: 4,174

## Re: Saving vectors into a matrix

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
SAS Super FREQ
Posts: 4,174

## Re: Saving vectors into a matrix

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;``````

New Contributor
Posts: 4

## Re: Saving vectors into a matrix

Thanks very much Rick!

🔒 This topic is solved and locked.