Чтобы сконфигурировать символьные размерности для Блоков s-function, можно использовать следующие функции C/C++. Можно сконфигурировать S-функции, чтобы поддержать прямое распространение, обратное распространение или прямое и обратное распространение символьных размерностей во время симуляции.
Многие из этих функций возвращают переменную SymbDimsId
. SymbDimsId
является уникальным целочисленным значением. Это значение соответствует каждой символьной спецификации размерности, которую вы создаете, или результат математической операции, которую вы выполняете с символьными размерностями.
S-функции C/C++ | Цель |
---|---|
Задайте, поддерживает ли S-функция символьные размерности. | |
Задайте символьные размерности входного порта и как те размерности распространяют вперед. | |
Задайте символьные размерности выходного порта и как те размерности распространяют назад. | |
Создайте | |
Создайте | |
Создайте | |
Создайте | |
Создайте | |
Создайте | |
Создайте | |
Создайте | |
Получите количество размерностей для | |
Получите | |
Установите предварительно скомпилированный | |
Получите скомпилированный | |
Установите скомпилированный | |
Установите предварительно скомпилированный | |
Получите скомпилированный | |
Установите скомпилированный | |
Установите скомпилированный |
Эта S-функция вычитает символьную размерность B
из символьной входной размерности. Это не поддерживает обратное распространение символьных размерностей, потому что скомпилированные символьные размерности входного порта не установлены. Символьные размерности установлены для выходного порта, таким образом, прямое распространение происходит.
static void mdlInitializeSizes(SimStruct *S) { // Enable symbolic dimensions for the s-function. ssSetSymbolicDimsSupport(S, true); } #if defined(MATLAB_MEX_FILE) #define MDL_SET_INPUT_PORT_SYMBOLIC_DIMENSIONS static void mdlSetInputPortSymbolicDimensions(SimStruct* S, int_T portIndex, SymbDimsId symbDimsId) { assert(0 == portIndex); // Set the compiled input symbolic dimension. ssSetCompInputPortSymbolicDimsId(S, portIndex, symbDimsId); // Register "B" and get its symbolic dimensions id. const SymbDimsId symbolIdForB = ssRegisterSymbolicDimsString(S, "B"); // Subtract "B" from the input symbolic dimension. const SymbDimsId outputDimsId = ssRegisterSymbolicDimsMinus(S, symbDimsId, symbolIdForB); //Set the resulting symbolic dimensions id as the output. ssSetCompOutputPortSymbolicDimsId(S, portIndex, outputDimsId); } #endif #if defined(MATLAB_MEX_FILE) #define MDL_SET_OUTPUT_PORT_SYMBOLIC_DIMENSIONS static void mdlSetOutputPortSymbolicDimensions(SimStruct *S, int_T portIndex, SymbDimsId symbDimsId) { assert(0 == portIndex); // The input dimensions are not set, so this S-function only // supports forward propagation. ssSetCompOutputPortSymbolicDimsId(S, portIndex, symbDimsId); } #endif
Эта S-функция транспонирует две символьных размерности. Это поддерживает прямое и обратное распространение символьных размерностей, потому что скомпилированная символьная размерность обоих порты ввода и вывода установлена.
static void mdlInitializeSizes(SimStruct *S) { // Enable symbolic dimensions for the s-function. ssSetSymbolicDimsSupport(S, true); } #if defined(MATLAB_MEX_FILE) #define MDL_SET_INPUT_PORT_SYMBOLIC_DIMENSIONS static void mdlSetInputPortSymbolicDimensions(SimStruct* S, int_T portIndex, SymbDimsId symbDimsId) { assert(0 == portIndex); ssSetCompInputPortSymbolicDimsId(S, portIndex, symbDimsId); assert(2U == ssGetNumSymbolicDims(S, symbDimsId)); if (SL_INHERIT == ssGetCompOutputPortSymbolicDimsId(S, portIndex)) { const SymbDimsId idVec[] = { ssGetSymbolicDim(S, symbDimsId, 1), ssGetSymbolicDim(S, symbDimsId, 0)}; // Register the transposed dimensions. // Set the output symbolic dimension to the resulting id. const SymbDimsId outputDimsId = ssRegisterSymbolicDims(S, idVec, 2U); ssSetCompOutputPortSymbolicDimsId(S, portIndex, outputDimsId); } } #endif #if defined(MATLAB_MEX_FILE) #define MDL_SET_OUTPUT_PORT_SYMBOLIC_DIMENSIONS static void mdlSetOutputPortSymbolicDimensions(SimStruct *S, int_T portIndex, SymbDimsId symbDimsId) { assert(0 == portIndex); ssSetCompOutputPortSymbolicDimsId(S, portIndex, symbDimsId); assert(2U == ssGetNumSymbolicDims(S, symbDimsId)); if (SL_INHERIT == ssGetCompInputPortSymbolicDimsId(S, portIndex)) { const SymbDimsId idVec[] = { ssGetSymbolicDim(S, symbDimsId, 1), ssGetSymbolicDim(S, symbDimsId, 0)}; const SymbDimsId inputDimsId = ssRegisterSymbolicDims(S, idVec, 2U); // Register the transposed dimensions. // Set the input symbolic dimension to the resulting id. ssSetCompInputPortSymbolicDimsId(S, portIndex, inputDimsId); } } #endif