Сконфигурируйте варианты размерности для блоков s-function

Чтобы сконфигурировать символьные размерности для Блоков s-function, можно использовать следующие функции C/C++. Можно сконфигурировать S-функции, чтобы поддержать прямое распространение, обратное распространение или прямое и обратное распространение символьных размерностей во время симуляции.

Многие из этих функций возвращают переменную SymbDimsId. SymbDimsId является уникальным целочисленным значением. Это значение соответствует каждой символьной спецификации размерности, которую вы создаете, или результат математической операции, которую вы выполняете с символьными размерностями.

S-функции C/C++Цель

ssSetSymbolicDimsSupport

Задайте, поддерживает ли S-функция символьные размерности.

mdlSetInputPortSymbolicDimensions

Задайте символьные размерности входного порта и как те размерности распространяют вперед.

mdlSetOutputPortSymbolicDimensions

Задайте символьные размерности выходного порта и как те размерности распространяют назад.

ssRegisterSymbolicDimsExpr

Создайте SymbDimsId из строки выражения (aExpr). Строка выражения должна сформировать допустимый синтаксис в C.

ssRegisterSymbolicDims

Создайте SymbDimsId из вектора SymbDimsId s.

ssRegisterSymbolicDimsString

Создайте SymbDimsId из строки идентификатора (aString).

ssRegisterSymbolicDimsIntValue

Создайте SymbDimsId из целочисленного значения (aIntValue)

ssRegisterSymbolicDimsPlus

Создайте SymbDimsId путем добавления двух символьных размерностей.

ssRegisterSymbolicDimsMinus

Создайте SymbDimsId путем вычитания двух символьных размерностей.

ssRegisterSymbolicDimsMultiply

Создайте SymbDimsId путем умножения двух символьных размерностей.

ssRegisterSymbolicDimsDivide

Создайте SymbDimsId путем деления двух символьных размерностей.

ssGetNumSymbolicDims

Получите количество размерностей для SymbDimsId.

ssGetSymbolicDim

Получите SymbDimsId от вектора SymbDimsId s.

ssSetInputPortSymbolicDimsId

Установите предварительно скомпилированный SymbDimsId входного порта. Можно вызвать эту функцию из функции mdlInitializeSizes.

ssGetCompInputPortSymbolicDimsId

Получите скомпилированный SymbDimsId входного порта.

ssSetCompInputPortSymbolicDimsId

Установите скомпилированный SymbDimsId входного порта.

ssSetOutputPortSymbolicDimsId

Установите предварительно скомпилированный SymbDimsId выходного порта. Можно вызвать эту функцию из функции mdlInitializeSizes.

ssGetCompOutputPortSymbolicDimsId

Получите скомпилированный SymbDimsId выходного порта.

ssSetCompOutputPortSymbolicDimsId

Установите скомпилированный SymbDimsId выходного порта.

ssSetCompDWorkSymbolicDimsId

Установите скомпилированный SymbDimsId индекса типа данных блока, работают (DWork) вектор.

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-функция, которая поддерживает прямое и обратное распространение символьных размерностей

Эта 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

Похожие темы