web-dev-qa-db-ja.com

Octave / Matlab:ベクターへの新しい要素の追加

ベクトルxがあり、要素(newElem)を追加する必要があります。

間に違いはありますか-

x(end+1) = newElem; 

そして

x = [x newElem];

71
URL87

x(end+1) = newElemはもう少し堅牢です。

x = [x newElem]は、xが行ベクトルの場合にのみ機能します。列ベクトルの場合は、x = [x; newElem]を使用する必要があります。ただし、x(end+1) = newElemは、行ベクトルと列ベクトルの両方で機能します。

ただし、一般的に、ベクトルの成長は避ける必要があります。これを頻繁に行うと、コードがクロールされる可能性があります。考えてみてください:配列の成長には、新しいスペースの割り当て、すべてのコピー、新しい要素の追加、古い混乱のクリーンアップが含まれます...前もって正しいサイズを知っていれば、かなりの時間の無駄です:)

90
ThijsW

@ThijsWの答えに追加するだけで、連結方式よりも最初の方式の方が速度が大幅に向上します。

big = 1e5;
tic;
x = Rand(big,1);
toc

x = zeros(big,1);
tic;
for ii = 1:big
    x(ii) = Rand;
end
toc

x = []; 
tic; 
for ii = 1:big
    x(end+1) = Rand; 
end; 
toc 

x = []; 
tic; 
for ii = 1:big
    x = [x Rand]; 
end; 
toc

   Elapsed time is 0.004611 seconds.
   Elapsed time is 0.016448 seconds.
   Elapsed time is 0.034107 seconds.
   Elapsed time is 12.341434 seconds.

私はこれらの時間を2012bで実行しましたが、matlab 2010aの同じコンピューターで同じコードを実行したときに

Elapsed time is 0.003044 seconds.
Elapsed time is 0.009947 seconds.
Elapsed time is 12.013875 seconds.
Elapsed time is 12.165593 seconds.

したがって、速度の利点は、Matlabのより新しいバージョンにのみ適用されると思います

26
Dan

前述したように、x(end+1) = newElemを使用すると、ベクトルが転置されているかどうかに関係なく、ベクトルをスカラーと連結できるという利点があります。したがって、スカラーを追加するためにより堅牢です。

ただし、一度に複数の要素を追加しようとすると、x = [x newElem]も機能することを忘れてはなりません。さらに、これは、マトリックスを連結したい場合に少し自然に一般化します。 M = [M M1 M2 M3]


全体として、既存のベクトルxをスカラーである場合とそうでない場合があるnewElemを連結できるソリューションが必要な場合は、次のトリックを実行する必要があります。

 x(end+(1:numel(newElem)))=newElem
4