- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 C-Mex S-function,它实现了 Tutsin - Eulor PECE 算法。
如果模型中仅存在一个 block ,则该函数可以完美运行。如果我放置该 block 的多个实例来过滤多个信号,则输出开始为空。
我认为函数的不同实例共享相同的内存,这会扰乱我的状态 vector 。我没有使用 MatLab 提供的离散状态函数,而是使用我自己声明的 double 组 (real_T ),它们不是外部的。
任何有关此问题的线索将不胜感激。
代码可以在这里找到:
https://www.dropbox.com/s/d5nfdnio6qqrizq/te_pece.c?dl=0
或下:
/* File : toto.c
* Abstract:
*
* Implements a Tutsin-Euler PECE algorithm.
*
* This block implements a time transfer function discretisation
* using Tutsin as a predictor and Euler as a corrector.
*
* This block is capable of receiving multiple inputs at once (bus / vector)
* and will treat them as separate signals to be processed by the same TF.
*
* Use in real time, fixed step, environment.
*
*
*/
#define S_FUNCTION_NAME toto
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
#include "matrix.h"
#include "mex.h"
#define NUMERATOR_IDX 0
#define NUMERATOR_PARAM(S) ssGetSFcnParam(S,NUMERATOR_IDX)
#define DENOMINATOR_IDX 1
#define DENOMINATOR_PARAM(S) ssGetSFcnParam(S,DENOMINATOR_IDX)
#define SAMPLE_TIME_IDX 2
#define SAMPLE_TIME(S) ssGetSFcnParam(S,SAMPLE_TIME_IDX)
#define NPARAMS 3
/*====================*
* Private members *
*====================*/
#define NSAMPLES 3
typedef enum {
eN = 0,
eNplusOne = 1,
eNplusTwo = 2}
rankEnum;
typedef enum {
eNcd = 0,
eStatesProcessed = 1,
eOutputProcessed = 2}
rankProcessState;
rankProcessState mProcessState;
int_T mTotalNumberOfDiscreteStates;
int_T mSignalNumberOfDiscreteStates;
int_T mNumberOfInputSignals;
int_T mLoopIndex;
int_T mInputWidth;
real_T* mNumerator;
real_T* mDenominator;
real_T** mPredictedStateVector;
real_T** mCorrectedStateVector;
real_T** mPredictedFunction;
real_T** mCorrectedFunction;
/*====================*
* Private methods *
*====================*/
void mInitializeRecursion();
void mComputePredictedStates(real_T iSampleTime, rankEnum iComputedRank, rankEnum iPreviousRank);
void mComputeCorrectedStates(real_T iSampleTime, rankEnum iComputedRank, rankEnum iPreviousRank);
void mComputePredictedFunction(real_T iInput, rankEnum iComputedRank);
void mComputeCorrectedFunction(real_T iInput, rankEnum iComputedRank);
void mUpdateStateVectors();
/* Function: mEmitWarning ===============================================
* Abstract:
* Display iMessage in matlab console
*
*/
void mEmitWarning(const char* iMessage)
{
mxArray *cell_array_ptr;
cell_array_ptr = mxCreateCellMatrix((mwSize)1,1);
mxSetCell(cell_array_ptr,(mwIndex)0,mxCreateString(iMessage));
mexCallMATLAB(0,NULL,1,&cell_array_ptr,"disp");
}
/*====================*
* S-function methods *
*====================*/
/* Function: mdlInitializeSizes ===============================================
* Abstract:
* The sizes information is used by Simulink to determine the S-function
* block's characteristics (number of inputs, outputs, states, etc.).
*/
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumSFcnParams(S, NPARAMS); /* Number of expected parameters */
if (!ssSetNumInputPorts(S, 1)) return;
ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);
ssSetInputPortDirectFeedThrough(S,0,true);
if (!ssSetNumOutputPorts(S, 1)) return;
ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED);
ssSetNumDiscStates(S, 1);
}
/* Function: mdlInitializeSampleTimes =========================================
* Abstract:
* Specifiy that we inherit our sample time from the driving block.
*/
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, *mxGetPr(SAMPLE_TIME(S)));
ssSetOffsetTime(S, 0, 0.0);
}
#define MDL_INITIALIZE_CONDITIONS
/* Function: mdlInitializeConditions ========================================
* Abstract:
* Initialize the discrete states to zero and
* allocate for states and function vectors
*/
static void mdlInitializeConditions(SimStruct *S)
{
int_T wDenominatorLength;
int_T wNumeratorLength;
real_T* wNumerator;
mInputWidth = ssGetInputPortWidth(S,0);
ssSetOutputPortWidth(S, 0, mInputWidth);
//Avoid repetitive use of mxGetPr/mxGetNumberOfElements by fetching datas once.
wNumeratorLength = mxGetNumberOfElements(NUMERATOR_PARAM(S));
wDenominatorLength = mxGetNumberOfElements(DENOMINATOR_PARAM(S));
wNumerator = mxGetPr(NUMERATOR_PARAM(S));
mDenominator = mxGetPr(DENOMINATOR_PARAM(S));
mNumberOfInputSignals = ssGetInputPortWidth(S,0);
mSignalNumberOfDiscreteStates = wDenominatorLength - 1;
mTotalNumberOfDiscreteStates = mNumberOfInputSignals*mSignalNumberOfDiscreteStates;
ssSetNumContStates(S, 0);
ssSetNumDiscStates(S, mTotalNumberOfDiscreteStates);
//Ensure identical sizes for numerator and number of states, for matrix computations
mNumerator = calloc(wDenominatorLength,sizeof(real_T));
if(wNumeratorLength < mSignalNumberOfDiscreteStates)
{
memcpy(mNumerator+(mSignalNumberOfDiscreteStates-wNumeratorLength),wNumerator,wNumeratorLength*sizeof(real_T));
}
else
{
memcpy(mNumerator,wNumerator,mSignalNumberOfDiscreteStates*sizeof(real_T));
}
//Allocating for keeping in memory from n to n+2
mPredictedStateVector = calloc(mTotalNumberOfDiscreteStates, sizeof(real_T));
mCorrectedStateVector = calloc(mTotalNumberOfDiscreteStates, sizeof(real_T));
mPredictedFunction = calloc(mTotalNumberOfDiscreteStates, sizeof(real_T));
mCorrectedFunction = calloc(mTotalNumberOfDiscreteStates, sizeof(real_T));
for (mLoopIndex = 0; mLoopIndex < mTotalNumberOfDiscreteStates; mLoopIndex++)
{
mPredictedStateVector[mLoopIndex] = calloc(NSAMPLES, sizeof(real_T));
mCorrectedStateVector[mLoopIndex] = calloc(NSAMPLES, sizeof(real_T));
mPredictedFunction[mLoopIndex] = calloc(NSAMPLES, sizeof(real_T));
mCorrectedFunction[mLoopIndex] = calloc(NSAMPLES, sizeof(real_T));
}
mInitializeRecursion(S);
}
/* Function: mdlOutputs =======================================================
* Abstract:
* y = Cx + Du
*
* The discrete system is evaluated using a controllable state space
* representation of the transfer function.
*
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
int_T wStateIndex;
real_T *wOutput = ssGetOutputPortRealSignal(S,0);
if (eStatesProcessed == mProcessState && ssIsSampleHit(S, 0, tid))
{
for (mLoopIndex = 0; mLoopIndex < mNumberOfInputSignals; mLoopIndex++)
{
if(NULL != wOutput)
{
*wOutput = 0;
for (wStateIndex = 0; wStateIndex < mSignalNumberOfDiscreteStates; wStateIndex++)
{
*wOutput += mNumerator[wStateIndex]* mCorrectedStateVector[mLoopIndex*mSignalNumberOfDiscreteStates+wStateIndex][eNplusTwo];
}
*wOutput++;
}
else
{
break;
}
}
mUpdateStateVectors();
mProcessState = eOutputProcessed;
}
}
#define MDL_UPDATE
/* Function: mdlUpdate ======================================================
* Abstract:
* dx = Ax + Bu
* The discrete system is evaluated using a controllable state space
* representation of the transfer function.
*
*/
static void mdlUpdate(SimStruct *S, int_T tid)
{
InputRealPtrsType wInput;
real_T wSampleTime;
if ((eOutputProcessed == mProcessState || eNcd == mProcessState) && ssIsSampleHit(S, 0, tid))
{
wInput = (InputRealPtrsType)ssGetInputPortSignalPtrs(S,0);
wSampleTime = *mxGetPr(SAMPLE_TIME(S));
if(wInput != NULL)
{
mComputePredictedStates(wSampleTime,eNplusTwo,eNplusOne);
mComputePredictedFunction(*wInput[0],eNplusTwo);
mComputeCorrectedStates(wSampleTime,eNplusTwo,eNplusOne);
mComputeCorrectedFunction(*wInput[0],eNplusTwo);
mProcessState = eStatesProcessed;
}
}
}
/* Function: mdlTerminate =====================================================
* Abstract:
* Free memory
*/
static void mdlTerminate(SimStruct *S)
{
UNUSED_ARG(S); /* unused input argument */
free(mNumerator) ;
free(mPredictedStateVector) ;
free(mCorrectedStateVector) ;
free(mPredictedFunction) ;
free(mCorrectedFunction) ;
}
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#else
#include "cg_sfun.h" /* Code generation registration function */
#endif
/*====================*
* Private methods *
*====================*/
/* Function: mInitializeRecursion =======================================================
* Abstract:
*
*
*/
void mInitializeRecursion()
{
mProcessState = eNcd;
if (mCorrectedFunction !=NULL)
{
mCorrectedFunction[mTotalNumberOfDiscreteStates-1][eNplusOne] = 1;
}
else
{
mEmitWarning("Error in mdlInitializeConditions: Vectors are null");
}
}
/* Function: mComputePredictedStates =======================================================
* Abstract:
*
*
*/
void mComputePredictedStates(real_T iSampleTime, rankEnum iComputedRank, rankEnum iPreviousRank)
{
if (mPredictedStateVector != NULL && mCorrectedStateVector !=NULL && mCorrectedFunction !=NULL)
{
for (mLoopIndex = 0; mLoopIndex < mTotalNumberOfDiscreteStates; mLoopIndex++)
{
mPredictedStateVector[mLoopIndex][iComputedRank] = mCorrectedStateVector[mLoopIndex][iPreviousRank] + 1/(double)2*iSampleTime*(3*mCorrectedFunction[mLoopIndex][iPreviousRank] - mCorrectedFunction[mLoopIndex][eN]);
}
}
else
{
mEmitWarning("Error in mComputePredictedStates: Vectors are null");
}
}
/* Function: mComputeCorrectedStates =======================================================
* Abstract:
*
*
*/
void mComputeCorrectedStates(real_T iSampleTime, rankEnum iComputedRank, rankEnum iPreviousRank)
{
if (mCorrectedStateVector != NULL && mCorrectedStateVector !=NULL && mPredictedFunction !=NULL)
{
for (mLoopIndex = 0; mLoopIndex < mTotalNumberOfDiscreteStates; mLoopIndex++)
{
mCorrectedStateVector[mLoopIndex][iComputedRank] = mCorrectedStateVector[mLoopIndex][iPreviousRank] + 1/(double)2*iSampleTime*(mPredictedFunction[mLoopIndex][iComputedRank] + mCorrectedFunction[mLoopIndex][iPreviousRank]);
}
}
else
{
mEmitWarning("Error in mComputeCorrectedStates: Vectors are null");
}
}
/* Function: mComputePredictedFunction =======================================================
* Abstract:
*
*
*/
void mComputePredictedFunction(real_T iInput, rankEnum iComputedRank)
{
int_T wStateIndex;
if (mPredictedStateVector != NULL && mPredictedFunction !=NULL)
{
for (mLoopIndex = 0; mLoopIndex < mTotalNumberOfDiscreteStates; mLoopIndex++)
{
if(0 == (mLoopIndex+1)%mSignalNumberOfDiscreteStates)
{
mPredictedFunction[mLoopIndex][iComputedRank] = iInput;
for (wStateIndex = 0; wStateIndex < mSignalNumberOfDiscreteStates; wStateIndex++)
{
mPredictedFunction[mLoopIndex][iComputedRank] += -1*mDenominator[mSignalNumberOfDiscreteStates-wStateIndex]* mPredictedStateVector[wStateIndex][iComputedRank];
}
}
else
{
mPredictedFunction[mLoopIndex][iComputedRank] = mPredictedStateVector[mLoopIndex+1][iComputedRank];
}
}
}
else
{
mEmitWarning("Error in mComputePredictedFunction: Vectors are null");
}
}
/* Function: mComputeCorrectedFunction =======================================================
* Abstract:
*
*
*/
void mComputeCorrectedFunction(real_T iInput, rankEnum iComputedRank)
{
int_T wStateIndex;
if (mCorrectedStateVector != NULL && mCorrectedFunction !=NULL)
{
for (mLoopIndex = 0; mLoopIndex < mTotalNumberOfDiscreteStates; mLoopIndex++)
{
if(0 == (mLoopIndex+1)%mSignalNumberOfDiscreteStates)
{
mCorrectedFunction[mLoopIndex][iComputedRank] = iInput;
for (wStateIndex = 0; wStateIndex < mSignalNumberOfDiscreteStates; wStateIndex++)
{
mCorrectedFunction[mLoopIndex][iComputedRank] += -1*mDenominator[mSignalNumberOfDiscreteStates-wStateIndex]* mCorrectedStateVector[wStateIndex][iComputedRank];
}
}
else
{
mCorrectedFunction[mLoopIndex][iComputedRank] = mCorrectedStateVector[mLoopIndex+1][iComputedRank];
}
}
}
else
{
mEmitWarning("Error in mComputeCorrectedFunction: Vectors are null");
}
}
/* Function: mUpdateStateVectors =======================================================
* Abstract:
*
*
*/
void mUpdateStateVectors()
{
if (mPredictedStateVector != NULL && mCorrectedStateVector !=NULL && mPredictedFunction != NULL && mCorrectedFunction !=NULL)
{
for (mLoopIndex = 0; mLoopIndex < mTotalNumberOfDiscreteStates; mLoopIndex++)
{
mPredictedStateVector[mLoopIndex][eN] = mPredictedStateVector[mLoopIndex][eNplusOne];
mCorrectedStateVector[mLoopIndex][eN] = mCorrectedStateVector[mLoopIndex][eNplusOne];
mPredictedFunction[mLoopIndex][eN] = mPredictedFunction[mLoopIndex][eNplusOne];
mCorrectedFunction[mLoopIndex][eN] = mCorrectedFunction[mLoopIndex][eNplusOne];
mPredictedStateVector[mLoopIndex][eNplusOne] = mPredictedStateVector[mLoopIndex][eNplusTwo];
mCorrectedStateVector[mLoopIndex][eNplusOne] = mCorrectedStateVector[mLoopIndex][eNplusTwo];
mPredictedFunction[mLoopIndex][eNplusOne] = mPredictedFunction[mLoopIndex][eNplusTwo];
mCorrectedFunction[mLoopIndex][eNplusOne] = mCorrectedFunction[mLoopIndex][eNplusTwo];
}
}
else
{
mEmitWarning("Error in mUpdateStateVectors: Vectors are null");
}
}
最佳答案
谢谢,我使用 DWork vector 解决了这个问题:)
关于c++ - C-Mex 函数和共享内存的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31943286/
有没有一种方法可以使用标准类型构造函数(例如 int、set、dict、list、tuple 等)以用户定义的方式将用户定义类的实例强制转换为其中一种类型?例如 class Example:
我知道这个问题在Stackoverflow中有很多问题,但是即使有很多答案,这些答案也帮不了我什么,也没有找到答案。 在我的WebAPP中,它可以正常工作,但是当我将其转换为API时,它失败了(主题标
这个问题已经有答案了: Why does the ternary operator unexpectedly cast integers? (3 个回答) 已关闭 9 年前。 最近遇到一个Java的陷
我尝试使用 FirebaseApp.configure() 配置 Firebase,但遇到以下崩溃: *** Terminating app due to uncaught exception 'c
我有一个自连接员工实体类,其中包含与其自身相关的 id、name 和 ref 列。我想创建它的新实例并将其保存到数据库。 首先我创建了一个 Employee 类的实例并将其命名为 manager。然后
我有一个用于添加新公寓的表单,在该表单中我有一个下拉列表,用户可以在其中选择负责的人员。 显然,当您从下拉列表中选择并尝试保存公寓时,我的应用程序认为该人已被修改。它给了我下面的错误,指示我应该首先保
从 Visualforce 页面,我需要检索我们组织的 salesforce 实例的 URL,而不是 Visual Force URL。 例如我需要https://cs1.salesforce.com
我遇到了一些可能的问题答案,但这是关于从 Hibernate 3.4.0GA 升级到 Hibernate 4.1.8 的问题。所以这曾经在以前的版本下工作,我已经四处搜索了为什么它在这个新版本中出现了
似乎一遍又一遍地问这个问题,我仍然找不到解决我问题的答案。我在下面有一个域模型。每个新创建或更新的“安全用户”都需要我确保其具有配置文件,如果没有,则创建一个新的配置文件并分配给它。 配置文件的要求相
我很难调试为什么 JPA 不级联我的 @ManyToMany 关系。我发现的所有答案都与缺少级联语句有关。但我确实拥有它们并且仍然得到: Caused by: org.hibernate.Transi
Play 服务 API 表明有一个叫做 Instance ID 的东西 但是,在 Android Studio 中包含以下内容后,我无法导入 InstanceID 类 compile "com.goo
我正在使用 Seam 框架。我有 2 个实体: 请求.java @Entity @Table(name = "SRV_REQUEST") public class Request { private
This question处理构建一个适当的Monad来自单子(monad)的实例,但仅在某些约束下 - 例如Set .诀窍是将其包装成 ContT ,它将约束推迟到包装/展开其值。 现在我想对 Ap
我正在尝试执行此查询: StringBuffer sb = new StringBuffer(); sb.append("select p from PointsEntity p " + "where
我试图了解是否可以更改我的 hibernate 配置并使用单个 MySQL 实例(而不是我当前拥有的多个 MySQL 实例): 我有一个使用 hibernate 的 Java 应用程序,与 2 个模式
我有一个选项卡滑动布局,其中包括四个选项卡,每个选项卡都有自己的布局和 fragment ,在我的主要 Activity 布局中,viewpager 参与更改选项卡。特定 View (选项卡)在应用程
我看到很多帖子声称他们正在运行 MySql 的 RDS 实例,但无法连接到该实例,但我没有运行 RDS。 我使用 EC2 实例来托管我的 WordPress 博客,该博客是使用 Web 平台安装程序安
因为我在我的 ec-2 实例上的 python 虚拟环境中运行应用程序( Airflow ),并且我想在同一个 ec2 实例上的默认 python 环境中运行命令,所以我认为 ssh 到我自己的实例更
这个问题已经有答案了: How to fix the Hibernate "object references an unsaved transient instance - save the tra
例子: run APP1 .. ... run APP1 ... run APP2 如何在 APP2 中对 Vue 说我需要调用 APP1?
我是一名优秀的程序员,十分优秀!