Сначала некоторая справочная информация, которую вы должны знать:
Matlab и C работают совершенно по-разному и используют различные типы типов данных.Для вызова C-кода из Matlab генерируются так называемые «мекс-функции».Matlab использует специальный тип данных с именем mxArray
для обмена данными между Matlab и этими «мекс-функциями», которые написаны на C.
В программе на C элемент (например, переменная) типаmxArray
представляет значение Matlab любого типа данных.Matlab предоставляет некоторые функции (например, mxGetData()
) для доступа к фактическим данным элемента данных Matlab из функции C: есть некоторая функция для проверки, представляет ли mxArray
значение с плавающей запятой или строку.Другая функция позволяет преобразовать значение из mxArray
в double
, если элемент имеет значение с плавающей запятой.
[vars, status] = csolve(params)
Это означает, что вы хотите вызвать "mex"-функция "из" S-функции ".
Теоретически это возможно, но это не так просто, как вы думаете:
Прежде всего, точка входа обоих типов функцийназван mexFunction()
в коде C.Это означает, что вы не можете просто объединить коды C обеих функций, потому что в этом случае в вашей S-функции будут две функции с одинаковым именем (mexFunction
).
Вы можете вызвать функцию mexCallMATLAB
;однако Mathworks пишет, что эту функцию нельзя вызывать из S-функций.
Другой возможностью будет загрузка mex-функции с использованием функций DLL (в Windows: LoadLibrary
, GetProcAddress
, FreeLibrary
)и вызовите функцию mexFunction()
мекс-функции с помощью указателя функции.
Однако в этом случае вам необходимо преобразовать все типы данных C в mxArray
данные и данные, возвращенные из мекс-функциинеобходимо преобразовать обратно ...
... файл TLC, необходимый во ... встроенном кодере
Функции, которые обращаются к данным mxArray
Тип доступен только во время работы Matlab.
Если вы генерируете код, который должен выполняться вне Matlab, вы не можете использовать mxArray
и, следовательно, не можете вызывать mex-функции.
Файл csolve.c
определяет четыре структурные переменные:
Vars vars;
Params params;
Workspace work;
Settings settings;
И файл фактически делает следующее:
- Считывает структуру
params
(mxArray
тип данных), конвертируетэтот контент для типов данных Cd записать данные в четыре структурные переменные, указанные выше . Вызвать следующий код:
steps = solve();
for (i = 0; i < extra_solves; i++)
solve();
Функция solve()
определена в других файлах .c
в проекте..
Возьмите значения из четырех структурных переменных и значение step
, возвращаемое solve()
, и преобразуйте данные в mxArray
.
- Вернуть результат как
[vars, status]
Вы можете определить четыре переменные в вашем коде S-функции, заполнить эти структуры так же, как это делает файл csolve.c
, вызвать функцию solve()
какэто показано выше и считывает данные vars
и status
непосредственно из четырех переменных.
Вы удаляете csolve.c
из своего проекта и добавляете другие файлы .c
вашей mex-функции вS-функция.