for
Matlab では、ループを使用せずに信号全体にわたって信号の局所的な変動を測定することは可能ですか? つまり、次のことを実装できますか。
window_length = <something>
for n = 1:(length_of_signal - window_length/2)
global_variance(n) = var(my_signal(1:window_length))
end
ベクトル化された形式で?
for
Matlab では、ループを使用せずに信号全体にわたって信号の局所的な変動を測定することは可能ですか? つまり、次のことを実装できますか。
window_length = <something>
for n = 1:(length_of_signal - window_length/2)
global_variance(n) = var(my_signal(1:window_length))
end
ベクトル化された形式で?
If you have the image processing toolbox, you can use STDFILT:
global_std = stdfilt(my_signal(:),ones(window_length,1));
% square to get the variance
global_variance = global_std.^2;
各行が上の行に1つシフトされ、行数がウィンドウ幅に等しい2D配列を作成できます。その場合、分散の計算は簡単です。これにはツールボックスは必要ありません。for
ただし、ループよりもはるかに高速かどうかはわかりません。
longSignal = repmat(mySignal(:), [1 window_length+1]);
longSignal = reshape(longSignal(1:((length_of_signal+1)*window_length)), [length_of_signal+1, window_length])';
global_variance = sum(longSignal.*longSignal, 2);
global_variance = global_variance(1:length_of_signal-window_length));
2番目の列は、上の列に対して1つ下にシフトされていることに注意してください。これは、操作するデータのブロックが行にある場合、転置を行うことを意味します。その後、sum演算子は最初の次元を合計します。これにより、必要な結果を含む行ベクトルが得られます。ただし、データのラッピングが少し行われているため、「適切な」値の数に制限する必要があります。
現在、MATLABが手元にないので(家にいます)、上記をテストできませんでしたが、一般的な考え方はうまくいくと思います。それはベクトル化されています-私はそれが速いことを保証することはできません...
MatlabCentralの「移動ウィンドウの標準偏差」機能を確認してください。コードは次のようになります。
movingstd(my_signal, window_length, 'forward').^2
移動する分散コードもありますが、壊れているようです。
アイデアはfilter
関数を使用することです。