2013-11-22 3 views
2

Я пытаюсь решить MATLAB проблему для создания вектора, как 1,2,2,3,3,3,4,4,4,4...Сформировать вектор в MATLAB

Так if n = 3, а затем вернуться

[1 2 2 3 3 3] И если n = 5, а затем вернуться

[1 2 2 3 3 3 4 4 4 4 5 5 5 5 5]

Это то, что я придумал:

ans=1 
for n=2:n 
ans=[ans n*ones(1,n)] 
end 

Но я пытаюсь свести к минимуму длину кода. У кого-нибудь есть идеи?

+1

Are вы после повышения эффективности, или короче длины кода? Не используйте 'ans', это имя переменной с именем matlab. – bla

ответ

2

еще несколько строк:

n = 5;  %number of elements 

A(cumsum(0:n)+1) = 1; 
B = cumsum(A(1:end-1)) 

возвращает

1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 
+1

Я думаю, он хотел бы получить тот, который занимает наименее вычислительные узлы в Matlab .... http: //www.mathworks.com/matlabcentral/cody/problems/1035-generate-a-vector-like-1-2- 2-3-3-3-4-4-4-4 – lennon310

+0

@ lennon310 Что такое «вычислительный узел»? Если это то, что я думаю, я считаю 4, что было бы самым коротким;) – thewaywewalk

+1

проверить это http://www.mathworks.com/matlabcentral/about/cody/#solutionsize интересное соревнование, но это будет не так, как только вы получить трюк от этого – lennon310

1
n = 5; 
A = triu(ones(n,1)*(1:n)); 
A(A==0) = []; 
+1

, что в плане ["конкуренции"] (http://www.mathworks.com/matlabcentral/cody/problems/1035-generate-a-vector-like-1-2-2- 3-3-3-4-4-4-4) кратчайшие (27 узлов), но все еще намного дольше, чем другие уже представленные решения;) – thewaywewalk

+0

@thewaywewalk Я не знал об этих конкурсах решений MATLAB. Интересно. – chappjc

0

Это похоже на ответ jkshah, но я бы подойти к нему немного по-другому,

n=5; 
M = ones(n,1)*(1:n) 
B = M(triu(ones(n))>0)'; 
2

В тот же дух, вот мой один лайнер:

nonzeros(triu(meshgrid(1:n)))' 
+0

+1. Странно, что 'meshgrid' быстрее, чем' repmat' –

+0

... однако, 'ones (1, n).'* (1: n) 'намного быстрее, чем' meshgrid' –

+0

Если я правильно понял вопрос, цель состоит в том, чтобы получить минимальное количество узлов matlab в соответствии с 'mtree', для использования в игре' Cody'. см. http://www.mathworks.com/matlabcentral/fileexchange/34754-calculate-size/content/calculateSize.m и приведенные выше комментарии. – bla

0

Вот еще один лайнер. В отличие от решений, основанных на triu, это один не создает дополнительные элементы в качестве промежуточных результатов (это не значит, что это быстрее, хотя):

fliplr(cumsum([n full(sparse(ones(1,n-1),cumsum(n:-1:2),-1))])) 
0

Немного «магия» решение:

ceil(sqrt(2*(1:(n^2+n)/2))-0.5) 

Смотрите визуализацию: enter image description here Это график функции SQRT (2 * (1: (п^2 + п)/2)) - 0,5:

plot(1:(n^2+n)/2,sqrt(2*(1:(n^2+n)/2))-0.5,'.') 

где xticklabels были изменены в соответствии следующий код:

set(gca,'xtick',cumsum(0:n),'xticklabel',0:n) 
Смежные вопросы