我正在尝试解决MATLAB
问题,以生成1,2,2,3,3,3,4,4,4,4...
所以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
但我正在努力减少代码长度。有人有什么想法吗?
答案 0 :(得分: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 :(得分:2)
同样的精神,这是我的一个班轮:
nonzeros(triu(meshgrid(1:n)))'
答案 2 :(得分:1)
n = 5;
A = triu(ones(n,1)*(1:n));
A(A==0) = [];
答案 3 :(得分:0)
这与jkshah的答案类似,但我的处理方式略有不同,
n=5;
M = ones(n,1)*(1:n)
B = M(triu(ones(n))>0)';
答案 4 :(得分:0)
这是另一个单行。与基于triu
的解决方案不同,此方法不会生成额外的元素作为中间结果(但这并不意味着它更快):
fliplr(cumsum([n full(sparse(ones(1,n-1),cumsum(n:-1:2),-1))]))
答案 5 :(得分:0)
一个'神奇'的解决方案:
ceil(sqrt(2*(1:(n^2+n)/2))-0.5)
查看可视化: 这是函数sqrt的图(2 *(1:(n ^ 2 + n)/ 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)