これが刺し傷です。
これは、実際にはデコンボリューションの問題の方が簡単です。あなたがユニークな答えを持つことができるかもしれないという点でそれはより簡単です。より難しい問題は、ピースがどのように見えるかもわからないことです。その場合はブラインドデコンボリューションと呼ばれます。これはより難しい問題であり、通常は反復的かつ統計的(MLまたはMAP)であり、解決策が正しくない場合があります。
幸いなことに、あなたのケースは簡単ですが、複数のピースがあるため、それでもそれほど簡単ではありません:p
一般的に混合デコンボリューションと呼ばれるかもしれないと思いますか?
したがって、t = 1、...Nのf[t]を長い信号とします。t = 0,1,2、...Mのh1[t] ...hn[t]を短い信号とします。明らかにここでは、N>>Mです。
したがって、あなたの仮説は次のとおりです。
(1) f[t] = h1[t+a1[1]]+h1[t+a1[2]] + ...
+h2[t+a2[1]]+h2[t+a2[2]] + ...
+....
+hn[t+an[1]]+h2[t+an[2]] + ...
その方程式の各行が実際にはhj*ujであることに注意してください。ここで、ujはシフトされたクロネッカーのデルタの合計です。*ここは畳み込みです。
んで、どうする?
Hjを(見方によっては転置される可能性があります)hjによって生成されたテプリッツ行列とすると、上記の式は次のようになります。
(2) F = H1 U1 + H2 U2 + ... Hn Un
subject to the constraint that uj[k] must be either 0 or 1.
ここで、Fはベクトル[f [0]、... F [N]]であり、Ujはベクトル[uj [0]、...uj[N]]です。
したがって、これを次のように書き直すことができます。
(3) F = H * U
ここで、H = [H1 ... Hn](水平連結)およびU = [U1; ...; Un](垂直連結)。
HはNx(nN)行列です。UはnNベクトルです。
さて、解空間は有限です。サイズは2^(nN)です。したがって、考えられるすべての組み合わせを試して、どれが最も低い|| F --H * U ||になるかを確認できますが、時間がかかりすぎます。
あなたができることは、疑似逆行列、多重線形回帰(最小二乗法を使用し、疑似逆行列になります)、またはこのようなものを使用して方程式(3)を解くことです。
Accelerate / LAPACKを使用して、非正方形のアンダー/オーバーコンストレイント行列を解くことは可能ですか?
次に、その解をHの零空間内で動かして、uj[k]が0または1でなければならないという制約の対象となる解を取得します。
または、Nelder-MeadやLevenberg-Marquardtなどを使用して、次の最小値を見つけることができます。
||F - H U|| + lambda g(U)
ここで、gは次のように定義される正則化関数です。
g(U) = ||U - U*||
ここで、| U [j] | <| U [j] -1|の場合はU*[j] = 0、それ以外の場合は1
わかりました。これが収束するかどうかはわかりません。そうでない場合は、独自の正則化を考え出す必要があります。一次方程式のセットがある場合、一般化された非線形オプティマイザーを使用するのはちょっとばかげています。
実際には、ノイズが発生する可能性があります。そのため、 MAPのようなものを使用して、以前のように小さな部分を適用することは、実際には悪い考えではないかもしれません。