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