を取得するのが大好きです。このコードが行うことは、各行が関心のあるウィンドウごとにアクセスする要素である2D行列を作成することです。コードがどのようにインデックスを生成するかについての直感を得たい場合は、具体的に最初のケース、X = 1;
とW = 3;
を見てください。
最初の行は要素1,2,3にアクセスしていることがわかります。2番目の行は要素2,3,4を最後の行、つまり5,6,7にアクセスすることで構成されています。ウィンドウ内の隣接する要素にアクセスする必要があることがわかるので、ベースインデックスは1,2,3、または一般に1からW
になる必要があります。 オフセットこれらのインデックスは、ウィンドウごとにT
の右側の要素の中央に配置する必要があります。最初のウィンドウのオフセットは単純に0で、2番目のウィンドウの次のオフセットは最後の行が3になるまで1になります。各行について、行が増加するにつれて基本インデックスに1を追加します。したがって、2番目の行の各基本索引に1を追加し、3番目の行の各基本索引に2を追加するなどの方法があります。オフセットインデックスを持つ基本インデックスを追加すると、最終的にT
の右の要素にアクセスするための正しいインデックスが得られます。
同様にX = 2;
とW = 3;
の場合、基本インデックスは1,2,3です。しかし、今アクセスする正しい要素は、第1行では1,2,3、第2行では3,4,5、第3行では5,6,7です。各行に対して、今は1の代わりにで基本インデックスをオフセットするようになりました。したがって、2番目の行は2を各基本索引に追加し、次に3番目の行の各基本索引に4を追加します。
一般に、ベースインデックスはベクトル1:W
を使用して作成され、オフセットインデックスはベクトル0:X:numel(T)-W
を使用して作成されます。 W
の減算は、要件に従って信号をサンプリングするときに境界から外れないようにするために必要です。先ほどお話したインデックスを作成するには、bsxfun
がこれを処理します。
基本インデックスに対応する1:W
の行ベクトルと、ウィンドウあたりのオフセットに対応する(0:X:numel(T)-W).'
の列ベクトルを作成します。最初のオフセットは0から始まり、次にX
の量だけ増加して、正しい中心がベースインデックスを配置するように計算されることに注意してください。私たちがnumel(T)-W
要素に達するまで停止します。これはあなたが述べた条件です。 bsxfun
を使用すると、2つのテンポラリ2D行列が作成され、行ベクトルは行ベクトルと同じ数の行だけ複製され、列ベクトルは行ベクトルと同じ数の列に対して複製されます。これら2つの行列を足し合わせると、結果のインデックス行列が得られます。 W = 3;
とX = 1;
でコードを実行
が得られます。同様に
>> T = [1, 5, 6, 8, 10, 14, 22];
>> X = 1;
>> W = 3;
>> ind = bsxfun(@plus, 1:W, (0:X:numel(T)-W).')
ind =
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
W = 3;
とX = 2;
場合、我々はまた、取得:
>> T = [1, 5, 6, 8, 10, 14, 22];
>> X = 2;
>> W = 3;
>> ind = bsxfun(@plus, 1:W, (0:X:numel(T)-W).')
ind =
1 2 3
3 4 5
5 6 7
あなたはこれらの指標は、正しい要素に対応していることを自分のために確認することができますこの場合、希望の行列を作成するにはT
を入力します。
我々は最終的に右の要素をつかむために私たちの行列へのインデックスにこれを使用します。X = 1;
とW = 3;
のためにこれを行う
out = T(ind);
ができます:X = 2;
とW = 3;
のための同様
>> out = T(ind)
out =
1 5 6
5 6 8
6 8 10
8 10 14
10 14 22
与える:
>> out = T(ind)
out =
1 5 6
6 8 10
10 14 22
あなたはベクトル化の前に多くの事前情報を持っている必要があります。それにもかかわらず、forループなしでやり遂げる方法はありません。 – 16per9
どのような演算を計算する必要がありますか?コンボルーションはあなたを助けませんか? –
ループをすばやく解除しないでください。時にはそれらは選択肢よりも高速です。しかし、私は前のコメントに同意します。これらのウィンドウで実行する必要がある操作に関する詳細情報が必要です。 – beaker