MATLAB のデコンボリューション アルゴリズムの問題か、浮動小数点の精度の問題 (あるいはその両方) が発生しています。デコンボリューション中に行われるすべての除算と減算による浮動小数点の精度だと思いますが、MathWorks に直接連絡して、彼らの考えを尋ねる価値があるかもしれません。
MATLAB ドキュメンテーションによると、 if[q,r] = deconv(v,u)
もv = conv(u,q)+r
成立する必要があります (つまり、 の出力はdeconv
常にこれを満たす必要があります)。あなたの場合、これは激しく違反しています。スクリプトの最後に次を追加します。
[reconSpike1 rem]=deconv(calcium1, k1);
max(conv(k1, reconSpike1) + rem - calcium1)
0 ではない 6.75e227 が得られます ;-) 次に、 の長さspike
を 6000 に変更してみてください。小さな数 (~1e-15) が得られます。spike
;の長さを徐々に増やします。誤差はますます大きくなります。スパイクにゼロ以外の要素を 1 つだけ入れた場合、この動作は発生しないことに注意してください。エラーは常にゼロです。それは理にかなっている; MATLAB が行う必要があるのは、すべてを同じ数で除算することだけです。
ランダムなベクトルを使用した簡単なデモを次に示します。
v = random('uniform', 1,2,100,1);
u = random('uniform', 1,2,100,1);
[q r] = deconv(v,u);
fprintf('maximum error for length(v) = 100 is %f\n', max(conv(u, q) + r - v))
v = random('uniform', 1,2,1000,1);
[q r] = deconv(v,u);
fprintf('maximum error for length(v) = 1000 is %f\n', max(conv(u, q) + r - v))
出力は次のとおりです。
maximum error for length(v) = 100 is 0.000000
maximum error for length(v) = 1000 is 14.910770
あなたが本当に何を達成しようとしているのかわからないので、これ以上のアドバイスをするのは難しい. ただし、パルスが積み重なっている問題があり、各パルスに関する情報を抽出したい場合、これは難しい問題になる可能性があることを指摘しておきます。このようなことに取り組んでいる人を何人か知っているので、参照が必要な場合はお知らせください。