我使用了大量的MATLAB作为Control类,而且真的让我很难受。他们希望我们使用大量的Simulink,即使我发现视觉表示没有用,Simulink和MATLAB脚本之间的接口很难弄清楚。
所以我有一个模型,我为scopes
添加了sinks
,可以从Simulink运行时直接将数据保存到工作区。但是,当我在脚本中使用命令sim
根据某些参数(stopTime
,solving method
等)直接使用模型时,结果会被隐藏在一个文档很少的对象中至少可以说我有:
simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');
现在我的工作区中有一个对象,但要访问我想要的数据我需要去3,有时在simout
的成员中有4层深。我的第一个问题是:
有没有办法直接访问或至少知道这些成员没有使用who
的繁琐工作。
我不想编译代码来访问其文档! help
对这些情况并没有多大帮助。
为什么Simulink模型在调用sink属性中规定的时间时保存数据。我知道我提到的代码行覆盖了一些simulink块处方(例如使用的解决方法)。
如何知道simulink模型如何与matlab脚本交互,一般来说我是编码的菜鸟,但文档并没有真正告诉我模型的正式定义及其形式用于matlab。我在某些方面害怕' sim'的默认设置。将覆盖我在早期模型中设置的一些设置,这些设置将被证明是一个令人讨厌的调试。
TL; DR 是否可以通过快速方式访问对象深埋的成员?例如,我现在必须这样做:
simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');
who(simout)
ScopeData = (simout.get('ScopeData'))
signals = (ScopeData.signals)
time = (ScopeData.time)
我可以做一些(Simout->ScopeData).signals
最后,为什么MATLAB套件会被呈现为日常交易者的应用程序,因为EE人员通常需要知道他们的编码?为什么没有使用带有标题的库和有关您在代码中导入的内容的文档(例如boost,string等)?通过隐藏机制,最后一个选项可能不那么pretty
,但是为了能够正确编写代码,我觉得我必须知道代码的大部分底层机制。
答案 0 :(得分:2)
常规强>
简而言之,工作区是您正在使用的变量环境。如果您运行脚本,您的工作区为'base'
,这与控制台使用的相同。所以Matlab确实有不同的环境,一种是被称为路径的包含环境,另一种是变量,称为工作空间。
Simulink使用另一种方法,这可以防止我猜测阴影变量名称。
要检查当前工作区中的检查成员,请使用who
要将成员写入其他工作区,请使用assignin
要在指定的工作区中运行某些内容,请使用evalin
您的问题
<强> 1 强> 谁列出了您不想要的当前工作空间中的所有变量。 整个simulink文档都不是那么好......
<强> 2 强> 它确实......
第3 强>
如果您运行脚本并定义变量,则会在base
工作空间中定义它们。当您通过输入其名称(例如a)在simulink中指定变量时,它会从base
工作空间加载它(因此这种方式没有任何问题)。
arround的另一种方式是使用给定的导出块,或者使用global
或assignin
在您自己的块中指定导出值。
<强> 4 强> 如果打开示波器块并单击选项 - 按钮(小齿轮),则可以选择导出选项。您也可以指定您要使用的类型。你似乎使用带有时间选项的结构,这是具有最多lvls的结构,如果你的问题只是它是一个结构,我建议使用数组类型。 您也可以使用Outputblock指定导出类型和名称。
所以我选择:
sim('modelname');
signals=ScopeData.signals;
time=ScopeData.time;
或者当指定为数组时:
sim('modelname');
signals=ScopeData(:,2);
time=ScopeData(:,1);
在上面的示例中,我没有指定模型的运行方式,但您也可以在发布时指定它。