Matlab parfor с arrayfun (нарезанная переменная)

Как следует из названия, я хочу иметь цикл parfor с внутренним использованием arrayfun.
Я создал минимальный рабочий пример для решения проблемы:
Наличие следующих строк в файле с именем thisparfortest.m

function test=thisparfortest(countmax)
parfor count=1:countmax
    test(count).nummer=count;
    test(count).bisdrei=arrayfun(@(testnum)eq(test(count).nummer,testnum),1:3);
end

команда mcc('-e','-v','thisparfortest') приводит к

Compiler version: 4.18.1 (R2013a) 
Error: File: **************\thisparfortest.m Line: 3 Column: 5 
The variable test in a parfor cannot be classified. 
See Parallel for Loops in MATLAB, "Overview". 
Processing C:\Program Files\MATLAB\R2013a\toolbox\matlab\mcc.enc 
Processing include files... 
2 item(s) added. 
Processing directories installed with MCR... 
The file mccExcludedFiles.log contains a list of functions excluded from the CTF archive. 
0 item(s) added. 
Generating MATLAB path for the compiled application... 
Created 43 path items. 
Parsing file "****************\thisparfortest.m" 
    (Referenced from: "Compiler Command Line"). 
Parsing file "C:\Program Files\MATLAB\R2013a\toolbox\compiler\deploy\deployprint.m" 
    (Referenced from: "Compiler Command Line"). 
Parsing file "C:\Program Files\MATLAB\R2013a\toolbox\compiler\deploy\printdlg.m" 
    (Referenced from: "Compiler Command Line"). 
Unable to determine function name or input/output argument count for function  
in MATLAB file "thisparfortest".  
Please use MLINT to determine if this file contains errors. 
Error using mcc
Error executing mcc, return status = 1 (0x1). 

но, как советовали, mlint thisparfortest (а также checkcode) возвращает без проблем - как в редакторе.
Цикл можно сделать и скомпилировать как цикл for.
Пожалуйста, не спрашивайте о смысле этих команд - они просто сюда за mwe.
Думаю, об этом нужно сообщить в mathworks - или я что-то не так сделал?
Некоторые дополнения: При запуске

function retval=thisparfortest(countmax)
helpfun=@(x)arrayfun(@(testnum)eq(x,testnum),1:3);
parfor count=1:countmax
    retval(count).nummer=count^2;
    retval(count).bisdrei=helpfun(retval(count).nummer);
end

только с циклом for это работает, но при использовании показанной версии с parfor это приводит к

Error using thisparfortest>(parfor supply) (line 3)
Undefined function or variable "retval".
Error in thisparfortest (line 3)
parfor count=1:countmax
Caused by:
    Undefined function or variable "retval"

Разве это не должно быть поймано с помощью mlint/checkcode? Это происходит без компилятора.


person Bastian Ebeling    schedule 13.08.2013    source источник


Ответы (1)


Я не думаю, что проблема имеет какое-либо отношение к компиляции. Когда я пытаюсь запустить ваш код в обычном MATLAB, я получаю ту же ошибку, что переменная test в parfor не может быть классифицирована.

Здесь нет ошибки — не каждый фрагмент кода может быть запущен внутри цикла parfor, и MATLAB не может точно определить до начала выполнения, какие фрагменты могут выполняться, а какие — нет. Он пытается делать свою работу хорошо, и когда это удается, анализатор кода сообщит вам об этом до начала выполнения, но если он не может, он выдаст ошибку времени выполнения, как вы уже обнаружили.

Возможно, вы можете придумать способ, которым MATLAB мог бы статически определить, что эта переменная не может быть классифицирована — в этом случае об этом можно было бы сообщить в MathWorks как запрос на улучшение для Code Analyzer.

person Sam Roberts    schedule 13.08.2013
comment
Привет, Сэм, спасибо за твои строки. Вы читали мои дополнения? После этого я также думаю, что это не имеет ничего общего с компилятором. Я также думаю, что это проблема нарезки переменной retval, которой нет перед входом в цикл, и это действительно то, что может быть обработано анализатором. Меня также интересуют разные ошибки (каким-то образом) одной и той же проблемы - сравнение моих строк кода выше. - person Bastian Ebeling; 13.08.2013
comment
Это определенно не проблема, связанная с компилятором. Я просмотрел ваши дополнения и согласен с тем, что вы можете ожидать, что вас поймают. Тем не менее, я не эксперт — все, что я знаю, это то, что статическое определение того, как классифицировать переменную, является гораздо более сложной и тонкой проблемой, чем кажется. Не стесняйтесь обращаться к MathWorks с предложениями. - person Sam Roberts; 13.08.2013