MATLAB Coder дает ошибку выхода за границы для структуры

Я пытаюсь использовать код MEX с помощью набора инструментов кодера MATLAB. В коде изначально были массивы ячеек, которые в данный момент не обрабатываются кодером, поэтому я решил использовать структуры в качестве компенсации за это.

Моя проблема в том, что размер структуры не фиксирован, и в этом проблема. У меня по сути так:

Temp= struct('a',"some variable");
for i = 2:x
    Temp(j).('a') = Temp(i-1).('a')*Temp(1).('a');
end

В командном окне MATLAB это было бы вполне приемлемо, однако при попытке построить MEX-файл выдает такую ​​ошибку:

Выражение индекса выходит за допустимые пределы. Попытка доступа к элементу 2. Допустимый диапазон: 1–1.

Есть ли способ исправить это или есть другое решение для структур, подобных «массиву ячеек», которое разрешит кодер?


person G Boggs    schedule 18.09.2014    source источник


Ответы (1)


Вы можете использовать repmat:

MyStruct = repmat(Temp,1,N);

где N — константа (т. е. жестко закодированная, не зависящая от данных).
Тогда, если хотите,

for i=2:N
    MyStruct(i).a = MyStruct(i-1).a*MyStruct(1).a;
end

Не нужно MyStruct(i).('a')

person ThP    schedule 18.09.2014
comment
+1 вот несколько соответствующих ссылок на документы: Определение массивов структур для генерации кода, Индексные подструктуры и поля. В любом случае, мне кажется, всю структуру можно было бы заменить обычным числовым массивом - person Amro; 19.09.2014
comment
@Amro: Для простого примера, предоставленного ОП, я согласен. - person ThP; 19.09.2014
comment
@ThP Это сработало, спасибо! Хотя у меня сейчас другая проблема. Некоторые переменные, которые я пытаюсь сохранить в структуре, сложны. Теперь появляется сообщение об ошибке: Невозможно присвоить сложное значение несложному местоположению. Есть ли способ исправить это? - person G Boggs; 19.09.2014
comment
@GBoggs: попробуйте инициализировать комплексной константой при первом создании структуры, например: Temp = struct('a',complex(0,0));. См.: Генерация кода для сложных данных - person Amro; 19.09.2014
comment
@Amro Ага, спасибо! Извините, но возникла другая ошибка, и это для другой части кода: размерность 1 фиксирована слева, но изменяется справа ([1 x 1] ~= [:? x :? ]). Я считаю, что переменная просто переназначается матрице, но инициализируется как 0. Есть ли способ исправить это? - person G Boggs; 19.09.2014
comment
@GBoggs: См. эту страницу: Диагностика и исправить ошибки данных переменного размера. Также прочтите раздел документации, в котором объясняются данные переменного размера. - person Amro; 19.09.2014