Matlab は、行列/配列の現在の境界外の要素にインデックスを付けていることを検出すると、不足している要素を自動的にゼロで埋めます。
>> clear b; b(10) = 5
b =
0 0 0 0 0 0 0 0 0 5
この機能は非常に便利ですが、非常に危険です。自分の場合など、ファクト宣言を非常に簡単に行うことができます。次のようなものを発行することにより、カスタムメイドのクラスの配列全体を作成できます
myClassArray(500) = myClass(1, 2);
これは、次のようなものよりもはるかに優れています
% cannot pre-allocate (zeros() or ones() give double/uint8/..., not myClass)
for ii = 1:499
myClassArray(ii) = myClass; % so, growing array
end
myClassArray(500) = myClass(1,2);
ただし、成長する配列を見つけるのは難しい場合があります。
a = zeros(10,1);
for ii = 1:10
a(ii+1) = rand;
end
これにより、パフォーマンスが大幅に低下する可能性があります。また、Matlab でプロトタイプ化されたコードを C++ などの静的に型付けされた言語に変換する場合、このコードをコピーするとバッファー オーバーフローが発生し、セグメンテーション違反が発生します。
さて、あなたのケースに戻ります:
clear a; a(1:2:5) = 1:-4:-7
は1:2:5
配列[1 3 5]
に展開され、1:-4:-7
は値を提供します[1 -3 -7]
。変数a
がまだ存在しないため、Matlab は新しい変数を作成し、要素[1 3 5]
に値を入力します[1 -3 -7]
。変数a
(つまり[2 4]
) を初期化するためにスキップされたインデックスは、自動的にゼロに初期化されます。
Python に精通している場合、複数の変数に複数の値を代入する構文に少し似ています。
x,y = 1,2
しかし、あなたのMatlabの場合、これらの異なる変数は存在しない配列へのインデックスであり、有効で一貫した配列にするために「何かで穴を埋める」必要があります。
これは物事を明確にしますか?