3

MATLAB でのコロン演算子とベクトルの展開について質問があります。私の問題は、次のコード行がどのように展開されるかを理解し、それを他のシーケンスに使用できるようにすることです。MATLAB コードの行は次のとおりです。

a(1:2:5) = 1:-4:-7 

aは展開前に定義されていないことに注意してください。これはベクトルを返します

a = 1 0 3 0 -7

私の問題は、 と の組み合わせがとの位置にゼロを持つ 5 つの要素のベクトルを返す{start}:{step}:{stop}方法と理由を理解することです。a(1:2:5)1:-4:-725

4

2 に答える 2

1

を定義するa(1:2:5)と、サイズ 5 のベクトル (ゼロ値) が作成され、奇数のインデックス付き (そのうちの 3 つが存在する) セルが選択されます。1:-4:-75 つではなく 3 つの値を作成します。最後に、選択した 3 つのセルに、次の 3 つの値のデータが入力されます。1:-4:-7

于 2012-08-24T08:06:08.220 に答える
1

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の場合、これらの異なる変数は存在しない配列へのインデックスであり、有効で一貫した配列にするために「何かで穴を埋める」必要があります。

これは物事を明確にしますか?

于 2012-08-24T09:44:07.873 に答える