我正在尝试解决
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
但我正在努力最小化代码长度。大家有什么想法吗?
还有几行:
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
本着同样的精神,这是我的一句话:
nonzeros(triu(meshgrid(1:n)))'
n = 5;
A = triu(ones(n,1)*(1:n));
A(A==0) = [];
这与 jkshah 的答案类似,但我的做法略有不同,
n=5;
M = ones(n,1)*(1:n)
B = M(triu(ones(n))>0)';
这是另一句俏皮话。与基于
triu
的解决方案不同,这个解决方案不会生成额外的元素作为中间结果(但这并不意味着它更快):
fliplr(cumsum([n full(sparse(ones(1,n-1),cumsum(n:-1:2),-1))]))
一点“神奇”的解决方案:
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)
有点长
function y = your_fcn_name(n)
N = sum(1:n);w = [] ;
for i=1:n
q(1:i) = i;
w = [w q(1:i)];
end
y = w;
end
这是一个简短的
function ans = your_fcn_name(x)
ans = repelem(1:x, 1:x)
end