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

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

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

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

ssSetSymbolicDimsSupport

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

mdlSetInputPortSymbolicDimensions

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

mdlSetOutputPortSymbolicDimensions

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

ssRegisterSymbolicDimsExpr

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

ssRegisterSymbolicDims

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

ssRegisterSymbolicDimsString

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

ssRegisterSymbolicDimsIntValue

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

ssRegisterSymbolicDimsPlus

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

ssRegisterSymbolicDimsMinus

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

ssRegisterSymbolicDimsMultiply

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

ssRegisterSymbolicDimsDivide

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

ssGetNumSymbolicDims

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

ssGetSymbolicDim

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

ssSetInputPortSymbolicDimsId

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

ssGetCompInputPortSymbolicDimsId

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

ssSetCompInputPortSymbolicDimsId

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

ssSetOutputPortSymbolicDimsId

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

ssGetCompOutputPortSymbolicDimsId

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

ssSetCompOutputPortSymbolicDimsId

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

ssSetCompDWorkSymbolicDimsId

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

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

Эта S-функция вычитает символьную размерность B от символьной входной размерности. Это не поддерживает обратное распространение символьных размерностей, потому что скомпилированные символьные размерности input port не установлены. Символьные размерности установлены для output port, таким образом, прямое распространение происходит.

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

Похожие темы