1

我正在使用内核密度估计器工具箱表单http://www.ics.uci.edu/~ihler/code/kde.html。但是当我尝试执行演示文件时出现以下错误 -

>> demo_kde_3
KDE Example #3 : Product sampling methods (single, anecdotal run)
Attempt to reference field of non-structure array.

Error in double (line 10)
if (npd.N > 0) d = 1;            % return 1 if the density exists

Error in repmat (line 49)
nelems = prod(double(siz));

Error in kde (line 39)
if (size(ks,1) == 1) ks = repmat(ks,[size(points,1),1]); end;

Error in demo_kde_3 (line 8)
p = kde([.1,.45,.55,.8],.05);  % create a mixture of 4 gaussians for
testing

谁能建议可能出了什么问题?我是 Matlab 的新手,很难找出问题所在。

谢谢你,

4

3 回答 3

1

尝试将当前目录从@kde文件夹中移开;执行此操作时,您可能必须将@kde文件夹添加到路径中。例如运行:

cd('c:\');
addpath('full\path\to\the\folder\@kde');

您可能还需要添加

addpath('full\path\to\the\folder\@kde\examples');

然后看看它是否有效。

看起来函数repmat(mathworks 函数)正在获取@kde类的double函数版本,从而导致错误。通常,只有类的对象@kde才能调用@kde文件夹中的函数。

我很少使用@folder类定义的形式,所以对语义不是很确定;我很好奇这是否对错误有任何影响。


一般来说,我不建议您将@folder类格式用于您所做的任何开发。mathworks 在几个版本之前将他们的 OO 范式大修为更熟悉(和有用)的格式。用于help classdef查看更多。此@kde代码似乎早于此升级。

于 2013-02-14T20:36:50.597 回答
0

MATLAB 为您提供发生错误的代码行。由于属于 MATLAB,错误可能在double第39 行。在 MATLAB 调试器中打开该文件,在该行设置断点(因此在执行该特定行之前立即停止执行),然后当代码在那里停止时,检查情况。在控制台中尝试整个代码行(复制粘贴或键入它,不要单步执行,因为单步执行会导致调试器中的代码执行结束时导致未捕获的错误),它应该会给您一个错误(但不会停止执行)。然后尝试该代码行的代码片段,哪些可以正常工作,哪些不能,例如。的结果是否有意义。repmatkde.msize(points, 1)

但是,调试不熟悉的代码并不是一件容易的事,尤其是如果您是 MATLAB 的初学者。但是,如果您学习并理解了 MATLAB 的基本数据类型(数组、元胞数组和结构)以及处理它们的不同方式,并将这些知识应用到第 39 行的情况中kde.m,希望您可以修复错误。

于 2013-02-14T20:21:45.823 回答
0

Repmat 调用double并期望调用内置的 double。

但是我猜这不是该代码的一部分:

if (npd.N > 0) d = 1;            % return 1 if the density exists

因此,如果一切正确,则意味着内置函数double已重载,这就是代码崩溃的原因。

编辑: 我看到@Pursuit 已经解决了这个问题,但我会留下我的答案,因为它更多地描述了检测方法。

于 2013-02-15T12:53:34.663 回答