arymimai.c
上传用户:loeagle
上传日期:2013-03-02
资源大小:1236k
文件大小:4k
源码类别:

通讯编程文档

开发平台:

Matlab

  1. /* $Revision: 1.19 $ */
  2. /*
  3.  * ARYMIMAI  array minimum/maximum index computation. 
  4.  *
  5.  *           Syntax:  [sys, x0] = arymimai(t,x,u,flag,Func)
  6.  *                      where Func is the string which could be min or max.
  7.  *                      There is one output which is the index number range
  8.  *                      from 0 to M-1 where M is the input vector size.
  9.  *                      The input could be any real data.
  10.  * Wes Wang 5/11/94
  11.  * Copyright 1996-2001 The MathWorks, Inc.
  12.  */
  13. /* specify the name of this S-Function. */
  14. #define S_FUNCTION_NAME arymimai
  15. /* Defines for easy access  the matrices which are passed in */
  16. #define NUM_ARGS    1
  17. #define FUN_NAME    ssGetArg(S, 0)
  18. /* include simstruc.h for the definition of the SimStruct and macro definitions. */
  19. #include "simstruc.h"
  20. #include "tmwtypes.h"
  21. #include <math.h>
  22. /*
  23.  * mdlInitializeSizes - initialize the sizes array
  24.  */
  25. static void mdlInitializeSizes(SimStruct *S)
  26. {
  27.   ssSetNumContStates(    S, 0);        /* number of continuous states */
  28.   ssSetNumDiscStates(    S, 0);        /* number of discrete states */
  29.   ssSetNumInputs    (    S, -1);       /* number of inputs */
  30.   ssSetNumOutputs   (    S, 1);        /* number of outputs */
  31.   ssSetDirectFeedThrough(S, 1);        /* direct feedthrough flag */
  32.   ssSetNumSampleTimes(   S, 1);        /* number of sample times */
  33.   ssSetNumInputArgs(     S, NUM_ARGS); /* number of input arguments */
  34.   ssSetNumRWork(         S, 0);        /* number of real work vector elements */
  35.   ssSetNumIWork(         S, 0);        /* number of integer work vector elements */
  36.   ssSetNumPWork(         S, 0);        /* number of pointer work vector elements */
  37. }
  38. /*
  39.  * mdlInitializeSampleTimes - initialize the sample times array
  40.  *
  41.  * This function is used to specify the sample time(s) for your S-function.
  42.  * If your S-function is continuous, you must specify a sample time of 0.0.
  43.  * Sample times must be registered in ascending order.
  44.  */
  45. static void mdlInitializeSampleTimes(SimStruct *S)
  46. {
  47.     ssSetSampleTimeEvent(S, 0, INHERITED_SAMPLE_TIME);
  48.     ssSetOffsetTimeEvent(S, 0, FIXED_IN_MINOR_STEP_OFFSET);
  49. }
  50. /*
  51.  * mdlInitializeConditions - initialize the states
  52.  * Initialize the states, Integers and real-numbers
  53.  */
  54. static void mdlInitializeConditions(real_T *x0, SimStruct *S)
  55. {
  56. }
  57. /*
  58.  * mdlOutputs - compute the outputs
  59.  *
  60.  * In this function, you compute the outputs of your S-function
  61.  * block.  The outputs are placed in the y variable.
  62.  */
  63. static void mdlOutputs(real_T *y, const real_T *x, const real_T *u, SimStruct *S, int_T tid)
  64. {
  65. int_T  inSize, i, ind;
  66. real_T tmp;
  67. char_T funct[5];
  68. mxGetString(FUN_NAME, funct, 4);  
  69. inSize = ssGetNumInputs(S);
  70. tmp = u[0];
  71. ind = 0;
  72. if (inSize > 1) 
  73. {
  74. if (funct[1] == 'a')
  75. {
  76. for (i=1; i<inSize; i++) 
  77. {
  78. if (tmp < u[i]) 
  79. {
  80. tmp = u[i];
  81. ind = i;
  82. }
  83. }
  84. }
  85. if (funct[1] == 'i') 
  86. {
  87. for (i=1; i<inSize; i++) 
  88. {
  89. if (tmp > u[i]) 
  90. {
  91. tmp = u[i];
  92. ind = i;
  93. }
  94. }
  95. }
  96. }
  97. y[0] = (real_T)ind;
  98. if (funct[2] == 'v')
  99. y[0] = tmp;
  100. }
  101. /*
  102.  * mdlUpdate - perform action at major integration time step
  103.  *
  104.  * This function is called once for every major integration time step.
  105.  * Discrete states are typically updated here, but this function is useful
  106.  * for performing any tasks that should only take place once per integration
  107.  * step.
  108.  */
  109. static void mdlUpdate(real_T *x, const real_T *u, SimStruct *S, int_T tid)
  110. {
  111. }
  112. /*
  113.  * mdlDerivatives - compute the derivatives
  114.  *
  115.  * In this function, you compute the S-function block's derivatives.
  116.  * The derivatives are placed in the dx variable.
  117.  */
  118. static void mdlDerivatives(real_T *dx, const real_T *x, const real_T *u, SimStruct *S, int_T tid)
  119. {
  120. }
  121. /*
  122.  * mdlTerminate - called when the simulation is terminated.
  123.  *
  124.  * In this function, you should perform any actions that are necessary
  125.  * at the termination of a simulation.  For example, if memory was allocated
  126.  * in mdlInitializeConditions, this is the place to free it.
  127.  */
  128. static void mdlTerminate(SimStruct *S)
  129. {
  130. }
  131. #ifdef   MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */
  132. #include "simulink.c"      /* MEX-file interface mechanism */
  133. #else
  134. #include "cg_sfun.h"       /* Code generation registration function */
  135. #endif