Странная функция с двойным именем «DoBenchmark» не может быть определена, так как функция определена только в одном месте - PullRequest
2 голосов
/ 08 мая 2019

(с Matlab 2018b под последней версией Windows10.) У меня есть папка Folder, содержащая DoStuff.m с кодом:

%addpath('./SubFolder/SubSubFolder'); // SubSubFolder contains mex file defining myFunction used below
%close all;

function [res] = DoStuff(param) % Function has same name as the script defining it

    res = myFunction(param)

end

, где myFunction определяется в файле mexw64, содержащемся в './SubFolder/SubSubFolder'.

Естественно, что при выполнении функции DoStuff (param) в графическом интерфейсе Matlab (в папке Folder) выдается следующая ошибка:

'myFunction' is not found in the current folder or on the MATLAB path, but exists in ...

... в './SubFolder/SubSubFolder'. Superb. Поэтому я удаляю % в первой строке DoStuff.m и повторно выполняю функцию DoStuff (param) внутри GUI Matlab (в папке Folder) и получаю следующую ошибку:

Function with duplicate name "DoStuff" cannot be defined.

Странно, поскольку DoStuff определяется только в одном месте: используется сценарий DoStuff.m. (Подтверждено which -all DoStuff в Matlab в Folder.)

Замечание. В Matlab2018b один может определил функцию с именем toto внутри скрипта с именем toto.m, Matlab не будет иметь никаких проблем с этим. Так что моя проблема не имеет ничего общего с тем же наименованием. Это связано с добавлением строки addpath, но я не знаю как. Подтверждение этого ощущения: замена строки res = myFunction(param) на res = 1 и раскомментирование addpath также приводит к ошибке именования.

1 Ответ

3 голосов
/ 08 мая 2019

Имя m-файла должно отличаться от имени функции, если функция находится внутри файла скрипта.т. е. ваше m-имя файла не может быть DoStuff.m, если DoStuff не является функциональным файлом.Либо DoStuff.m должен быть файлом функции, подобным этому:

function [res] = DoStuff(param) % Note that there is no executable line before this
res = myFunction(param)
end

, либо вам следует переименовать либо вашу функцию, либо ваш m-файл.

Если вы переименуете свой m-файл, вы можете использовать его следующим образом:

addpath('./SubFolder/SubSubFolder'); %SubSubFolder contains mex file defining myFunction
close all;

res = DoStuff(param); %Calling the function

function [res] = DoStuff(param)
res = myFunction(param)
end
...