4

整数 n を指定すると、次のようにベクトルを取得したいと思います。たとえば、 の場合n=3、ベクトルは である必要が[1,1,2,1,2,3]あり、 の場合n=4、ベクトルは である必要があり[1,1,2,1,2,3,1,2,3,4]ます。それを行う簡単な方法はありますか?ありがとう。

4

4 に答える 4

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.
于 2013-11-01T15:41:45.733 に答える
1

その他の方法を3つ紹介します。@A によるベクトル化されたソリューションよりもメモリ効率が良いと思います。Dondaまたは@Mohsenですが、もちろんn = 1000以下の場合は問題になる可能性はありません。

最も興味深い部分は、2 つの方法の速度の違いです。2 番目と 3 番目の方法もn=100001 秒未満で動作しますが、最初の方法ははるかに遅いです。

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
于 2013-11-01T14:57:59.333 に答える
0

疎行列を使用して、次のことができます。

p      = 1:4;
x      = cumsum(sparse(1,cumsum(p)+1,-p)+1);
x(end) = []

結果:

x =

   1   1   2   1   2   3   1   2   3   4

この方法の最大の利点は、順序付けされていないシーケンス長でも機能することです。

p      = [2 3 2 4];
x      = cumsum(sparse(1,cumsum(p)+1,-p)+1);
x(end) = []

結果:

x =

   1   2   1   2   3   1   2   1   2   3   4
于 2020-01-07T09:22:21.557 に答える