Is there a smarter way to create a large vector, with repeated numbers in a diminishing quantity?

I need the vector to begin with 144 evenly spaced '2's, then 143 '3's, then 142 '4's, etc. I see the brute force method, but it doesn't seem very smart. Is there a way to get Matlab to create this vector for me?
thx

2 Comments

Valid code --
n=14;A1=(1:n)'*ones(1,n);A2=triu(A1)';A3=reshape(A2,1,n^2);A=A3(A3~=0),
Any question that makes a golf challenge gets a vote from me!

Sign in to comment.

 Accepted Answer

A one liner:
n = 144;
v = sort(nonzeros(triu(bsxfun(@times,(2:n+1).',ones(1,n)))));
or
v = sort(nonzeros(triu(toeplitz(2:n+1))));
Golf!
v=hankel(n+1:-1:2);
v=sort(v(~~v))
%33 characters
transpose it if you want a row vector.

More Answers (4)

I think the repmat command can help:
[repmat(2,144,1);repmat(3,143,1);repmat(4,142,1)]

2 Comments

no :) 144 times?
n=144;
A1=(1:n)'*ones(1,n);
A2=tril(A1);
A3=reshape(A2...);
find... all zero elements
Upps^^, than this way:
start_repeat = 144;
start_number = 2;
final_size = (start_repeat+1)*start_repeat / 2;
final_vec = zeros(final_size,1);
index = 1;
for i=start_repeat:-1:1
final_vec(index:index+i-1,1) = repmat(start_number+start_repeat-i,i,1);
index = index + i;
end

Sign in to comment.

[1,2,2,3,3,3,4,4,4,4,...] similar task
n=1:10 trinv(n) = floor((1+sqrt(1+8*n))/2)
(<http://oeis.org/A002024>)
Using rude for run length decoding:
n = 144;
val = 1:n;
len = val;
Out = rude(len,val); % rude on fex

Categories

Find more on Earth and Planetary Science in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!