2

当我尝试将 rmabackadj 函数的输出存储到变量时遇到问题。当没有分配输出变量时,该函数可以正常工作。此功能是生物信息学工具箱的一部分。

所以问题是当我尝试运行以下它时它可以正常工作:

rmabackadj(myprobeData.PMIntensities)

但是当我尝试运行以下命令时,出现错误:

>> A = rmabackadj(myprobeData.PMIntensities)
Warning: Colon operands must be real scalars. 
> In rmabackadj>findMaxDensity at 255
  In rmabackadj at 164 
Error using ksdensity>parse_args (line 162)
X must be a non-empty vector.
Error in ksdensity (line 114)
[axarg,yData,n,ymin,ymax,xispecified,xi,u,m,kernelname,...
Error in rmabackadj>findMaxDensity (line 255)
[f, x] = ksdensity(z,  min(z):(max(z)-min(z))/npoints:max(z), 'kernel', 'epanechnikov');
Error in rmabackadj (line 164)
            mu = findMaxDensity( o(o < mu));

我也在网上搜索了它,但我找不到任何结果。有人知道这个错误的原因吗?

PS:当我将ans变量分配给新变量时,它已正确分配。

A = ans
4

2 回答 2

1

我很确定这是一个错误。

首先,仅当您提供输出参数时它才会出错的原因是因为函数中有一个内部开关,它基于nargout. 这是一个奇怪的设计,但不一定是错误。

内部rmabackadj有两个子功能findMaxDensityfindMaxDensity2。主例程调用findMaxDensity,它应该找到参数的初始猜测mu。但是(当我运行您在评论中提到的文档示例时),它会在边缘发现一个可怕的猜测,从而导致错误。

当我将文件编辑为 callfindMaxDensity2而不是findMaxDensity时,它似乎产生了一个合理的猜测,并且运行良好,没有错误。我不能保证这个猜测是否真的“正确”,但对我来说这似乎是合理的,它只是作为一个初始猜测来开始一个更好的估计过程。(注意,如果您自己执行此操作,请务必先保存旧版本的副本)。

我猜这是一个错误,或者findMaxdensity是产生了一个异常糟糕的猜测,应该被捕获,或者它真的应该被调用findMaxDensity2并且代码没有被更新来调用一个新的子函数。

无论哪种方式,我都会向 MathWorks报告。

PS 我正在运行 MATLAB R2011b。首先检查问题是否已在更新的版本中得到修复或行为不同。

于 2013-09-24T09:22:38.800 回答
0

Mathworks 确认了这个错误并发布了一个解决方法,并提到这可能会在未来的版本中得到修复。

rmabackadj一种可能的解决方法是在函数的第 163 行添加以下条件

% estimate mu from left-of-the-mode data
  if any(o < mu)
     mu = findMaxDensity( o(o < mu));
  end

N<1000 个样本的错误也已得到确认,但尚未发布任何解决方法。

如果解决 N<1000 个样本错误,我将更新线程。

于 2013-10-03T07:21:00.577 回答