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。私はまだより効率的なソリューションを探しています。