Как построить временную переменную structt в построителе s-функции? - PullRequest
0 голосов
/ 18 июня 2019

Я сталкиваюсь с проблемой в конструкторе функций s, мне нужно использовать переменную структуры temp для переноса входных данных в расширенную функцию C.

Справочная информация: функция csolve - это решатель квадратичного программирования, сгенерированный CVXGEN длямоя проблема с QP, и я проверил функцию в matlab s-fun уровня 2.Теперь я хочу использовать конструктор функций s для генерации файла TLC, который поддерживает генерацию встроенного кода.

Моя проблема: 1) Я должен использовать переменную структурной переменной temp 'params' для входных данных функции csolve вПанель выходов, не могли бы вы помочь мне решить эту проблему?2) Я обнаружил, что в папке cvxgen есть заголовочный файл, содержащий функции 'tic' и 'toc', как использовать эти функции в конструкторе функций s?

params.Aeq=Aeq;
params.beq=beq;
params.Aineq=Aineq;
params.bineq=bineq;
params.Smat=Smat;
params.Wmat=Wmat;
params.alpha=alpha;

[vars, status] = csolve(params)

y0=vars.x;
converge=status.converge;

enter image description here

enter image description here

enter image description here

прилагаемые файлы см. здесь

1 Ответ

0 голосов
/ 18 июня 2019

Сначала некоторая справочная информация, которую вы должны знать:

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-функция.

...