утверждать одномерный двойной массив неограниченной длины (кодер Matlab)

В настоящее время я использую этот код:

assert(isa(values,'double'));
assert(size(values, 1) <= 1000);

убедить кодера Matlab сделать значения одномерным массивом. Конечная цель — иметь возможность взаимодействовать с ним через C# и PInvoke. Это создает подпись C, содержащую это:

const real_T values[1000], const int32_T values_size[1]

Кажется, я могу использовать это даже для одномерных массивов, длина которых меньше 1000. Существуют ли более аккуратные способы достижения вышеизложенного (т.е. утверждать, что значения представляют собой одномерный массив неограниченной длины)?

PS:

Я также использовал:

assert(all(size(values) == [1 Inf]));

но пока отложил это, поскольку созданная структура кажется очень сложной (см. Также здесь), и я делаю не знаю, как заполнить его из С#.


person cs0815    schedule 18.02.2013    source источник
comment
Извините, я удалил другой.   -  person cs0815    schedule 18.02.2013
comment
Одна из причин: MEX-функции вызывают библиотеки времени выполнения MATLAB, поэтому вам нужно иметь MATLAB...   -  person cs0815    schedule 18.02.2013
comment
Чтобы понять это правильно: ваше приложение написано на C#. У вас есть исходный код Matlab, который вы хотите перевести Matlab → C. Полученный C должен вызываться C#.   -  person edgar.holleis    schedule 18.02.2013
comment
Да - извините, если я был неясен. Я бы предпочел "мой" метод утверждения...   -  person cs0815    schedule 18.02.2013
comment
Кстати, теперь я знаю, как заполнять struct_emxArray_real_T. Это объясняется здесь: mathworks.co.uk/help/fixedpoint/ug/ Если вы восстановили свой другой вопрос, я думаю, что могу ответить сейчас. Меня все время смущало то, что вы говорили о кодере Matlab. Я думал, это человек, твой коллега!   -  person David Heffernan    schedule 19.02.2013
comment
Спасибо, Дэвид - извините за недостаточно ясность. Думал, что все знают кодировщик Matlab (-: вопрос будет восстановлен завтра.   -  person cs0815    schedule 19.02.2013
comment
Да я явно не в курсе! ;-) Теперь вспомним об этом. На самом деле ссылка, которую я нашел (независимо), такая же, как и в вашем ответе.   -  person David Heffernan    schedule 19.02.2013
comment
Хорошо, спасибо. я посмотрю на это   -  person cs0815    schedule 19.02.2013
comment
@David Дэвид, я повторно разместил свой вопрос здесь: stackoverflow.com/questions/15022890/   -  person cs0815    schedule 22.02.2013


Ответы (1)


Кодер Matlab теперь, похоже, поддерживает динамическое выделение памяти (это было не так, когда я в последний раз использовал его примерно в 2008 году).

Полный пример: http://www.mathworks.de/products/matlab-coder/examples.html?file=/products/demos/shipping/coder/coderdemo_atoms.html

Обновление: для массивов с динамическим размером Matlab использует структуры данных EMX: http://www.mathworks.de/de/help/fixedpoint/ug/c-code-interface-for-unbounded-arrays-and-structure-fields.html

person edgar.holleis    schedule 18.02.2013
comment
Спасибо. Не уверен, что это поможет. Я мог бы что-то упустить здесь, но я не вижу, где они утверждают (как в моей ситуации!), Что переменная, которую нужно передать, является одномерным массивом нефиксированного размера. Спасибо - person cs0815; 18.02.2013
comment
Утверждения — не единственный способ. Альтернативой является указание codegen в командной строке, что следует делать в отношении аргументов функции, которую она переводит. В примере, который я связал с командной строкой, это: codegen run_atoms -args {coder.typeof(atom, [1 Inf]),int32(0),int32(0)} -config cfg - person edgar.holleis; 18.02.2013