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 件のコメント

Igor
Igor 2011 年 6 月 3 日
Valid code --
n=14;A1=(1:n)'*ones(1,n);A2=triu(A1)';A3=reshape(A2,1,n^2);A=A3(A3~=0),
Sean de Wolski
Sean de Wolski 2011 年 6 月 3 日
Any question that makes a golf challenge gets a vote from me!

サインインしてコメントする。

 採用された回答

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.

その他の回答 (4 件)

Friedrich
Friedrich 2011 年 6 月 3 日
I think the repmat command can help:
[repmat(2,144,1);repmat(3,143,1);repmat(4,142,1)]

2 件のコメント

Igor
Igor 2011 年 6 月 3 日
no :) 144 times?
n=144;
A1=(1:n)'*ones(1,n);
A2=tril(A1);
A3=reshape(A2...);
find... all zero elements
Friedrich
Friedrich 2011 年 6 月 3 日
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

サインインしてコメントする。

Igor
Igor 2011 年 6 月 3 日
[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
n = 144;
vm = triu(repmat(n+1:-1:1,n+1,1));
vm(vm>0);

2 件のコメント

Igor
Igor 2011 年 6 月 3 日
:) shortest :)
Sean de Wolski
Sean de Wolski 2011 年 6 月 3 日
Isn't right...

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeCreating and Concatenating Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by