3

Matlab でベクトルの重み付き最大値を計算したいと思います。加重最大値については、次のことを意図しています。

2*N+1重みのベクトルとW={w[-N], w[-N+1] .. w[0] .. w[N]}入力シーケンス を指定するとA、重み付き最大値は次のベクトル Mになり ます。m[i]=max(w[-N]*a[i-N], w[-N+1]*a[i-N+1], ... w[N]*a[i+N])

たとえば、ベクトルA= [1, 4, 12, 2, 4]と重みが与えられたW=[0.5, 1, 0.5]場合、重み付けされた最大値は になりますM=[2, 6, 12, 6, 4]

これは を使用して実行できますordfilt2が、ordfilt2重みは乗算ではなく加算として使用されます。

私は実際に4Dマトリックスに取り組んでいますが、4Dウェイトマトリックスは分離可能であるため、どの1Dソリューションも機能します。

私の現在の解決策は、入力配列のシフトされたコピーを生成Aし、シフトに従ってそれらに重みを付け、すべての配列を最大化することです。シフトは使用して実行circshiftされ、プロセスのボトルネックです。シフトされた行列を「手動で」インデックス付けして生成すると、さらに遅くなることが判明しました。

より効率的なソリューションを提案できますか?

編集: 正の A の場合M=exp(ordfilt2(log(A), length(W), ones(size(W)), log(W))) 、仕事をしますが、上記の解決策よりも時間がかかりますcircshift。私はまだより効率的なソリューションを探しています。

4

1 に答える 1

0
>> B = padarray(A, [0 floor(numel(W)/2)], 0); % Pad A with zeros
>> B = bsxfun(@times, B(bsxfun(@plus, 1:numel(B)-numel(W)+1, (0:numel(W)-1)')), W(:)); % Apply the weights
>> M = max(B)  % Compute the local maxima
M =
     2     6    12     6     4
于 2013-12-03T14:00:04.960 に答える