Octave 找不到函数句柄

Octave can't find function handle

我使用 Octave 来 运行 selective search 代码,它给我这个错误:

error: @SSSimColourTextureSizeFillOrig: no function and no method found

出现这个错误的代码是:

simFunctionHandles = {@SSSimColourTextureSizeFillOrig, @SSSimTextureSizeFill, @SSSimBoxFillOrig, @SSSimSize};

但是这段代码在 MATLAB 上可以成功运行,所以我猜 Octave 中有一些错误或者它不支持函数句柄?

Octave在函数句柄方面绝对没有问题。您的具体问题是文件的格式。

如果您查看 post 中链接的 Github 存储库,您所指的函数是 MATLAB P-Code files。这些是经过混淆的 MATLAB 文件,在 MATLAB 中只能是 运行。 P-Code 文件的目的是获取原始源代码并隐藏原始源代码,这样您就无法获取原始源代码并对其进行修改以供自己使用。也就是说,您别无选择,只能将此功能用于您的目的,并且您无法修改其行为。

然而,Octave 没有这种混淆支持,因此它自然无法为您重构原始代码运行。

查看此 Octave 线程了解更多详细信息:http://octave.1599824.n4.nabble.com/Matlab-p-files-td1627334.html

.. 所以基本上,你是 SOL。您只能 运行 MATLAB 中的那些函数。然而,你可能有一些运气,联系原作者并获得原始 .m 文件,但这些是 P-Code 文件的事实可能是因为有一些作者不想的方法和技巧共享,但需要以系统其余部分正常工作的方式分发此代码。

对于那些最终出现在这里的人,一种可能是您在函数定义之前调用它。例如下面的代码

f = @computeSquare;
a = 4;
b = f(a);

function y = computeSquare(x)
    y = x.^2;
end

来自here,会导致错误:

error: invalid function handle, unable to find function for @computeSquare
error: called from
    test at line 3 column 3

您唯一需要做的就是将函数定义移动到您调用它的地方上方:

function y = computeSquare(x)
    y = x.^2;
end

f = @computeSquare;
a = 4;
b = f(a);