在MATLAB中生成一个向量

时间:2013-11-22 18:27:36

标签: matlab

我正在尝试解决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

但我正在努力减少代码长度。有人有什么想法吗?

6 个答案:

答案 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)

查看可视化: enter image description here 这是函数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)