您遇到了 MATLAB 反卷积算法的问题,或浮点精度问题(或两者兼而有之)。我怀疑它是浮点精度,因为在反卷积期间发生了所有除法和减法,但可能值得直接联系 MathWorks 询问他们的想法。
根据 MATLAB 文档,如果[q,r] = deconv(v,u)
, thenv = conv(u,q)+r
也必须成立(即 的输出deconv
应始终满足这一点)。在您的情况下,这是严重违反的。将以下内容放在脚本的末尾:
[reconSpike1 rem]=deconv(calcium1, k1);
max(conv(k1, reconSpike1) + rem - calcium1)
我得到 6.75e227,它不为零;-) 接下来尝试将长度更改spike
为 6000;你会得到一个小数字(~1e-15)。逐渐增加长度spike
;误差会越来越大。请注意,如果您只将一个非零元素放入尖峰,则不会发生此行为:错误始终为零。这说得通; 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
我不知道你真正想要完成什么,所以很难提供进一步的建议。但我只想指出,如果您遇到脉冲堆积的问题,并且您想提取有关每个脉冲的信息,这可能是一个棘手的问题。我认识一些从事此类工作的人,所以如果您需要一些参考资料,请告诉我,我会问他们。