给定一个整数n,我想得到如下的向量。例如。如果n = 3,则向量应为[1,1,2,1,2,3],如果n = 4,则向量应为[1,1,2,1,2,3,1,2,3] ,4],等等。有一个简单的方法吗?感谢。
答案 0 :(得分:3)
您可以使用此
获得快速解决方案w=ones(1,n*(n+1)/2);
w(1+cumsum(1:n-1))=-(0:n-2);
w=cumsum(w);
在我的机器上,Dennis的解决方案对于n<=8
来说速度最快,但之后这种方法最快。
使用此基准测试代码:
n=2000;
N=1e6/n;
tic
for k=1:N
A = repmat((1 : n)', 1, n);
A = A(triu(ones(n)) ~= 0);
end
toc
tic
for k=1:N
w=ones(1,n*(n+1)/2);
w(1+cumsum(1:n-1))=-(0:n-2);
w=cumsum(w);
end
toc
tic
for k=1:N
%// Fast vector growing
v=[];
for t = 1:n
x = 1:t;
v(end+x) = x;
end
end
toc
n=4
Elapsed time is 5.688693 seconds.
Elapsed time is 3.576366 seconds.
Elapsed time is 1.878887 seconds.
n=8
Elapsed time is 2.985184 seconds.
Elapsed time is 1.851967 seconds.
Elapsed time is 1.834574 seconds.
n=100
Elapsed time is 1.084404 seconds.
Elapsed time is 0.352033 seconds.
Elapsed time is 2.502724 seconds.
n=1000
Elapsed time is 15.625361 seconds.
Elapsed time is 3.949131 seconds.
Elapsed time is 11.497764 seconds.
n=2000
Elapsed time is 29.940548 seconds.
Elapsed time is 7.649394 seconds.
Elapsed time is 22.846367 seconds.
答案 1 :(得分:2)
这是一个使用“上三角矩阵”函数从简单重复完整序列中选择所需条目的解决方案:
A = triu(repmat((1 : n)', 1, n));
A = A(A ~= 0)'
triu
将对角线下方的所有内容设置为零。这种方法仅在原始序列不包含零时才有效,当然这是为1 : n
给出的。但是,更好的解决方案可能是仅将triu
的结果用于索引:
A = repmat((1 : n)', 1, n);
A = A(triu(ones(n)) ~= 0);
这非常快,在我的机器上n = 10,000的运行时间低于1秒。
正如Dennis Jaheruddin指出的那样,这种方法暂时需要的内存比结果所需的少两倍(精确因子是2 n /(n + 1))。
答案 2 :(得分:1)
以下是其他三种方法。我希望它们比@A的矢量化解决方案更有效。 Donda或@Mohsen,但当然n = 1000或更低,这不太可能是一个问题。
最有趣的部分是两种方法之间的速度差异,第二种和第三种方法在一秒钟之内也适用于n=10000
,但第一种方法要慢得多!
n = 1000;
% Slow vector growing
tic
v=[];
for t = 1:n
v = [v 1:t];
end
toc % 0.6 sec
tic
% Fast vector growing
v=[];
for t = 1:n
x = 1:t;
v(end+x) = x;
end
toc % 0.01 sec
tic
% Preallocated loop
v=zeros(n*(n+1)/2,1);
count = 0;
for t = 1:n
x = 1:t;
v(count+x) = x;
count = count+t;
end
toc % 0.01 sec as well