Ошибка с файлом MEX. Индекс превышает размеры матрицы. Значение индекса 3 превышает допустимый диапазон [1-2] массива gesgroup

У меня есть файл функции для файла mex. Но при запуске mex-файла выдает ошибку. Ниже приведен код.

В коде я инициализировал 3 вектора с именами group,horgroup,gesgroup и объявил gesgroup как varsize.

group = zeros(1,2);    
horgroup = zeros(1,2); 
gesgroup = zeros(1,2); 
coder.varsize('gesgroup');

в нескольких строках group и horgroup вычисляются как массивы размером (1 * 2), скажем, group = [1 2] и horgroup = [3 4] позже мне нужно объединить группу и horgroup в gesgroup, используя

gesgroup = [group, horgroup];
gesgroup(gesgroup==0) = NaN;

этот код не дает никаких ошибок при создании файла MEX, но когда я запускаю файл MEX, он выдает ошибку в двух строках выше, говоря: «Индекс превышает размеры матрицы. Значение индекса 3 превышает допустимый диапазон [1-2] массива gesgroup»

Дайте мне знать, если мне нужно что-то изменить в коде и снова сгенерировать mex-файл.


person coolcrasher    schedule 07.05.2014    source источник
comment
У меня есть файл функции в mex-файл - что это значит? Прочитав ваш вопрос, я даже не уверен, где находится вызов функции mex или как он вообще связан. Вы вряд ли получите ошибку индексации от mex-функции, если только ваш код C не проверит это и не выдаст ошибку, или вы не вернете вектор/матрицу из mex-функции, которая меньше, чем должна быть, и в этом случае она d быть MATLAB, выдающим ошибку, а не функция mex. Вы должны иметь возможность отлаживать это дальше, установив dbstop if error и запустив свой код, а затем проверив измерения и индексы.   -  person Praetorian    schedule 07.05.2014
comment
@Praetorian Я предполагаю, что это m-файл функции MATLAB, скомпилированный непосредственно в mex с помощью matlab-coder (обычно делается для увеличения скорости), а затем используется в MATLAB, если это так, я вижу проблему ...   -  person RTL    schedule 07.05.2014
comment
@Praetorian - вот что значит то, что сказал RTL   -  person coolcrasher    schedule 08.05.2014


Ответы (1)


Проблема в инициализации gesgroup инициализируется размером 1x2, но строка

gesgroup = [group, horgroup];

сделает его 1x4 (поскольку и group, и horgroup имеют размер 1x2), вам нужно инициализировать его как таковой или как переменный размер
например.

gesgroup = zeros(1,4); 

or

coder.varsize('gesgroup')

Я думаю, что проблема возникла, поскольку размер определяется до достижения coder.varsize('gesgroup'), поэтому массив уже имеет фиксированный размер.

person RTL    schedule 07.05.2014
comment
Я бы проверил объявление coder.varsize('gesgroup') перед gesgroup = zeros(1,2) и дал бы вам знать - person coolcrasher; 08.05.2014
comment
Нужно ли вообще иметь переменный размер? если он сначала определен как [group, horgroup] и остается 1x4, конечно, проще просто инициализировать его как 1x4? - person RTL; 09.05.2014
comment
это сработало отлично. Размер gesgroup не всегда (1*4), зависит от размера и типа ввода - person coolcrasher; 09.05.2014