# I have a vector like x=[2 3 1 5],how could I generate a vector like [1 2 1 2 3 1 1 2 3 4 5]?

1 view (last 30 days)

Show older comments

xiyou fu
on 17 Sep 2016

Commented: David Goodmanson
on 19 Sep 2016

I have a vector like x=[2 3 1 5],how could I generate a vector like [1 2 1 2 3 1 1 2 3 4 5]?

##### 0 Comments

### Accepted Answer

David Goodmanson
on 18 Sep 2016

Assuming the rule you want is what Teja thought, then if you have room for a couple of arrays that could get pretty large depending on your data, you could try

m = max(x);

n = length(x);

A = repmat((1:m)',1,n); % columns of consecutive integers

M = repmat(x,m,1); % rows of copies of x

A(A>M) = nan;

A = A(:); % concatenate columns

A(isnan(A)) = []; % keep good ones

A = A';

For x of length 1e7 with random entries from 1 to 10, this takes about 5 sec on my PC.

##### 2 Comments

David Goodmanson
on 19 Sep 2016

### More Answers (3)

Teja Muppirala
on 17 Sep 2016

x = [2 3 1 5]

y = arrayfun(@(a)1:a,x,'uniform',0)

y = cat(2,y{:})

y = 1 2 1 2 3 1 1 2 3 4 5

##### 2 Comments

Walter Roberson
on 18 Sep 2016

Yes, you could write a mex file to do the work.

You can calculate the size of the output as sum() of the inputs, and you can pre-allocate that, and you can have a loop to fill it in, but it is not at all clear that it would end up being more efficient than what Teja shows.

Image Analyst
on 17 Sep 2016

What rule are you using to generate that output? Here are several ways:

% Define input data.

x=[2 3 1 5]

% Generate a vector [1 2 1 2 3 1 1 2 3 4 5]:

output1 = [x(3), x(1), x(3), x(1), x(2), x(3), 1:length(x), x(end)]

output2 = [x([3, 1, 3, 1, 2, 3]), 1:length(x), x(end)]

output3 = [1 2 1 2 3 1 1 2 3 4 5];

output4 = [x([3, 1, 3, 1, 2, 3]), 1:5]

I'm sure there is a near infinite number of other rules that can get you that output vector. So what is your rule?

##### 2 Comments

Image Analyst
on 18 Sep 2016

Tell me the rule. I don't have the Crystal Ball Toolbox yet and since you didn't share your for loop code, I don't know what you tried to do. You still haven't told me the rule even though I explicitly asked.

I gave you 4 ways to build that vector. What's wrong with them?

Andrei Bobrov
on 19 Sep 2016

x = x(:);

ons = ones(sum(x),1);

ii = cumsum(x)+1;

ons(ii(1:end-1)) = ons(ii(1:end-1)) - x(1:end-1);

out = cumsum(ons);

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!