1

ベクトルのサブセットの最大値を取得してから、ベクトルをシフトする必要があります。たとえば、列ベクトル

a=[1;2;3;4;5;6;7]

max(a(1:3)), max(a(2:4)), ...を取得して、max(a(5:end))すべての出力を別のベクトルに配置するにはどうすればよいですか? これはforループで簡単に実行できますが、MATLABで行列演算を使用して、できれば1行のコードで実行するエレガントな方法を探しています(MATLABで行列演算を実行する可能性が高いことはわかっていますが) for ループを使用して実装する必要があります)。

ありがとうございました!

4

5 に答える 5

2

シフトとウィンドウの長さが一定であると仮定すると(それぞれの場合は1と3)、nlfilterを使用して、ベクトルに対する一般的なスライディングウィンドウ操作を定義できます。

a = [1:7];

fun = @(x) max(x(:));
b = nlfilter(a, [1 4], fun);
于 2012-10-12T22:04:00.403 に答える
1

これが私の試みです。まず、「ウィンドウ」の長さを定義します (この場合は 3)。次に、すべてのウィンドウのベクトルにbsxfunインデックスを作成するために使用します。a最後のステップは単純なmax関数呼び出しです。

flen = 3;
idx = bsxfun(@plus, [0:flen-1]', 1:numel(a)-flen+1);
max(a(idx))

これは一般的です。つまり、ウィンドウ サイズを変更できます。

nlfilter今は確認できませんが、これは基本的な matlab であり、よりも高速である必要があります。

編集bsxfun上記のソリューションと提案されたソリューションの簡単なパフォーマンス比較は次のとおりim2colです。

a = rand(10^7,1);

tic;
idx = bsxfun(@plus, [0:2]', 1:numel(a)-2);
m1 = max(a(idx));
toc

tic;
m2 = max(im2col(a,[3 1],'sliding'));
toc;

isequal(m1, m2)

Elapsed time is 0.839869 seconds.
Elapsed time is 1.797665 seconds.

ans =

 1

bsxfunもちろん動作し、2 倍以上高速です。

于 2012-10-13T11:33:36.907 に答える
1

あなたが提供する例について:

b = max([a(1:end-2) a(2:end-1) a(3:end)], [], 2)

よりエレガントで一般的なaccumarray解決策もあると思いますが、今は思いつく時間がありません :)

于 2012-10-13T10:10:15.050 に答える
0

Signal Processing Toolbox がある場合は、buffer関数を使用できます。ベクトルを取り、各列がスライディング ウィンドウ内のベクトルの値を含む行列を生成します。

あなたの場合:

>> a = (1:7)';
>> buffer(a,3,2,'nodelay')

ans =

     1     2     3     4     5
     2     3     4     5     6
     3     4     5     6     7

次に、MATLAB のmax関数を適用して、各列の最大値を計算します。結論として、1 行のコードで、

>> max(buffer(a,3,2,'nodelay'))

ans =

     3     4     5     6     7
于 2015-01-06T15:00:10.640 に答える
-1

すべての助けをありがとう。これにより、いくつかのアイデア、特に nlfitler を使用するという提案が得られました。nlfitler が im2col を呼び出し、これの最大値を取得するとうまくいくことがわかりました。特に、提示されたサンプル ベクトルは確率変数を含む実数ベクトルの簡略化であるため、存在する bsxfun オプションは機能しません。

max(im2col(a,[3 1],'sliding'))

于 2012-10-13T17:08:30.567 に答える