在 MATLAB 中生成向量

问题描述 投票:0回答:8

我正在尝试解决

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

但我正在努力最小化代码长度。大家有什么想法吗?

matlab
8个回答
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 

2
投票

本着同样的精神,这是我的一句话:

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

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

0
投票

这与 jkshah 的答案类似,但我的做法略有不同,

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

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:(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)

0
投票

有点长

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

0
投票

这是一个简短的

function ans = your_fcn_name(x)
   ans = repelem(1:x, 1:x)
end
© www.soinside.com 2019 - 2024. All rights reserved.